aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs32
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs117
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs3501
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs157
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs22
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs32
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs46
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs13
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs71
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs65
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs21
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Helpers.cs45
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs172
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs39
20 files changed, 3081 insertions, 1278 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
index 998f40b..1e19032 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
@@ -28,9 +28,7 @@
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection;
32using System.Threading; 31using System.Threading;
33using log4net;
34using OpenMetaverse; 32using OpenMetaverse;
35using OpenSim.Framework; 33using OpenSim.Framework;
36using OpenSim.Framework.Monitoring; 34using OpenSim.Framework.Monitoring;
@@ -39,6 +37,8 @@ using OpenSim.Region.ScriptEngine.Interfaces;
39using OpenSim.Region.ScriptEngine.Shared; 37using OpenSim.Region.ScriptEngine.Shared;
40using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; 38using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
41using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer; 39using Timer=OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Timer;
40using System.Reflection;
41using log4net;
42 42
43namespace OpenSim.Region.ScriptEngine.Shared.Api 43namespace OpenSim.Region.ScriptEngine.Shared.Api
44{ 44{
@@ -269,6 +269,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
269 /// <param name="itemID"></param> 269 /// <param name="itemID"></param>
270 public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) 270 public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID)
271 { 271 {
272 // Remove a specific script
272// m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID); 273// m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID);
273 274
274 lock (staticLock) 275 lock (staticLock)
@@ -282,7 +283,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
282 // Remove from: HttpRequest 283 // Remove from: HttpRequest
283 IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>(); 284 IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>();
284 if (iHttpReq != null) 285 if (iHttpReq != null)
285 iHttpReq.StopHttpRequestsForScript(itemID); 286 iHttpReq.StopHttpRequest(localID, itemID);
286 287
287 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); 288 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>();
288 if (comms != null) 289 if (comms != null)
@@ -364,6 +365,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
364 } 365 }
365 } 366 }
366 367
368 public static void StateChange(IScriptEngine engine, uint localID, UUID itemID)
369 {
370 // Remove a specific script
371
372 // Remove dataserver events
373 m_Dataserver[engine].RemoveEvents(localID, itemID);
374
375 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>();
376 if (comms != null)
377 comms.DeleteListener(itemID);
378
379 IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>();
380 if (xmlrpc != null)
381 {
382 xmlrpc.DeleteChannels(itemID);
383 xmlrpc.CancelSRDRequests(itemID);
384 }
385
386 // Remove Sensors
387 m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID);
388
389 }
390
367 public static Object[] GetSerializationData(IScriptEngine engine, UUID itemID) 391 public static Object[] GetSerializationData(IScriptEngine engine, UUID itemID)
368 { 392 {
369 List<Object> data = new List<Object>(); 393 List<Object> data = new List<Object>();
@@ -439,4 +463,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
439 } 463 }
440 } 464 }
441 } 465 }
442} \ No newline at end of file 466}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
new file mode 100644
index 0000000..fce8ff8
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -0,0 +1,117 @@
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.Threading;
30using System.Reflection;
31using System.Collections;
32using System.Collections.Generic;
33using System.Runtime.Remoting.Lifetime;
34using OpenMetaverse;
35using Nini.Config;
36using OpenSim;
37using OpenSim.Framework;
38using OpenSim.Region.CoreModules.World.LightShare;
39using OpenSim.Region.Framework.Interfaces;
40using OpenSim.Region.Framework.Scenes;
41using OpenSim.Region.ScriptEngine.Shared;
42using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
43using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
44using OpenSim.Region.ScriptEngine.Interfaces;
45using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
46using OpenSim.Services.Interfaces;
47
48using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
49using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
50using LSL_Key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
51using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
52using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
53using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
54using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
55
56namespace OpenSim.Region.ScriptEngine.Shared.Api
57{
58 [Serializable]
59 public class CM_Api : MarshalByRefObject, ICM_Api, IScriptApi
60 {
61 internal IScriptEngine m_ScriptEngine;
62 internal SceneObjectPart m_host;
63 internal TaskInventoryItem m_item;
64 internal bool m_CMFunctionsEnabled = false;
65
66 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
67 {
68 m_ScriptEngine = ScriptEngine;
69 m_host = host;
70 m_item = item;
71
72 if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false))
73 m_CMFunctionsEnabled = true;
74 }
75
76 public override Object InitializeLifetimeService()
77 {
78 ILease lease = (ILease)base.InitializeLifetimeService();
79
80 if (lease.CurrentState == LeaseState.Initial)
81 {
82 lease.InitialLeaseTime = TimeSpan.FromMinutes(0);
83 // lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
84 // lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
85 }
86 return lease;
87 }
88
89 public Scene World
90 {
91 get { return m_ScriptEngine.World; }
92 }
93
94 public string cmDetectedCountry(int number)
95 {
96 m_host.AddScriptLPS(1);
97 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
98 if (detectedParams == null)
99 return String.Empty;
100 return detectedParams.Country;
101 }
102
103 public string cmGetAgentCountry(LSL_Key key)
104 {
105 if (!World.Permissions.IsGod(m_host.OwnerID))
106 return String.Empty;
107
108 UUID uuid;
109
110 if (!UUID.TryParse(key, out uuid))
111 return String.Empty;
112
113 UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid);
114 return account.UserCountry;
115 }
116 }
117}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index c0b8373..f05aaa9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -24,14 +24,16 @@
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 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. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Diagnostics; //for [DebuggerNonUserCode]
31using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
32using System.Text; 33using System.Text;
33using System.Threading; 34using System.Threading;
34using System.Text.RegularExpressions; 35using System.Text.RegularExpressions;
36using System.Timers;
35using Nini.Config; 37using Nini.Config;
36using log4net; 38using log4net;
37using OpenMetaverse; 39using OpenMetaverse;
@@ -44,6 +46,7 @@ using OpenSim.Region.CoreModules.World.Land;
44using OpenSim.Region.CoreModules.World.Terrain; 46using OpenSim.Region.CoreModules.World.Terrain;
45using OpenSim.Region.Framework.Interfaces; 47using OpenSim.Region.Framework.Interfaces;
46using OpenSim.Region.Framework.Scenes; 48using OpenSim.Region.Framework.Scenes;
49using OpenSim.Region.Framework.Scenes.Serialization;
47using OpenSim.Region.Framework.Scenes.Animation; 50using OpenSim.Region.Framework.Scenes.Animation;
48using OpenSim.Region.Framework.Scenes.Scripting; 51using OpenSim.Region.Framework.Scenes.Scripting;
49using OpenSim.Region.Physics.Manager; 52using OpenSim.Region.Physics.Manager;
@@ -67,6 +70,7 @@ using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
67using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString; 70using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
68using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3; 71using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
69using System.Reflection; 72using System.Reflection;
73using Timer = System.Timers.Timer;
70using System.Linq; 74using System.Linq;
71using PermissionMask = OpenSim.Framework.PermissionMask; 75using PermissionMask = OpenSim.Framework.PermissionMask;
72 76
@@ -115,11 +119,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
115 protected int m_notecardLineReadCharsMax = 255; 119 protected int m_notecardLineReadCharsMax = 255;
116 protected int m_scriptConsoleChannel = 0; 120 protected int m_scriptConsoleChannel = 0;
117 protected bool m_scriptConsoleChannelEnabled = false; 121 protected bool m_scriptConsoleChannelEnabled = false;
122 protected bool m_debuggerSafe = false;
118 protected IUrlModule m_UrlModule = null; 123 protected IUrlModule m_UrlModule = null;
119 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = new Dictionary<UUID, UserInfoCacheEntry>(); 124 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache =
120 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp. 125 new Dictionary<UUID, UserInfoCacheEntry>();
126 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
121 protected ISoundModule m_SoundModule = null; 127 protected ISoundModule m_SoundModule = null;
122 128
129// protected Timer m_ShoutSayTimer;
130 protected int m_SayShoutCount = 0;
131 DateTime m_lastSayShoutCheck;
132
133 private Dictionary<string, string> MovementAnimationsForLSL =
134 new Dictionary<string, string> {
135 {"FLY", "Flying"},
136 {"FLYSLOW", "FlyingSlow"},
137 {"HOVER_UP", "Hovering Up"},
138 {"HOVER_DOWN", "Hovering Down"},
139 {"HOVER", "Hovering"},
140 {"LAND", "Landing"},
141 {"FALLDOWN", "Falling Down"},
142 {"PREJUMP", "PreJumping"},
143 {"JUMP", "Jumping"},
144 {"STANDUP", "Standing Up"},
145 {"SOFT_LAND", "Soft Landing"},
146 {"STAND", "Standing"},
147 {"CROUCHWALK", "CrouchWalking"},
148 {"RUN", "Running"},
149 {"WALK", "Walking"},
150 {"CROUCH", "Crouching"},
151 {"TURNLEFT", "Turning Left"},
152 {"TURNRIGHT", "Turning Right"}
153 };
123 //An array of HTTP/1.1 headers that are not allowed to be used 154 //An array of HTTP/1.1 headers that are not allowed to be used
124 //as custom headers by llHTTPRequest. 155 //as custom headers by llHTTPRequest.
125 private string[] HttpStandardHeaders = 156 private string[] HttpStandardHeaders =
@@ -140,9 +171,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
140 public void Initialize( 171 public void Initialize(
141 IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle) 172 IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
142 { 173 {
174 m_lastSayShoutCheck = DateTime.UtcNow;
175
143 m_ScriptEngine = scriptEngine; 176 m_ScriptEngine = scriptEngine;
144 m_host = host; 177 m_host = host;
145 m_item = item; 178 m_item = item;
179 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
146 m_coopSleepHandle = coopSleepHandle; 180 m_coopSleepHandle = coopSleepHandle;
147 181
148 LoadConfig(); 182 LoadConfig();
@@ -231,6 +265,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
231 get { return m_ScriptEngine.World; } 265 get { return m_ScriptEngine.World; }
232 } 266 }
233 267
268 [DebuggerNonUserCode]
234 public void state(string newState) 269 public void state(string newState)
235 { 270 {
236 m_ScriptEngine.SetState(m_item.ItemID, newState); 271 m_ScriptEngine.SetState(m_item.ItemID, newState);
@@ -240,6 +275,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
240 /// Reset the named script. The script must be present 275 /// Reset the named script. The script must be present
241 /// in the same prim. 276 /// in the same prim.
242 /// </summary> 277 /// </summary>
278 [DebuggerNonUserCode]
243 public void llResetScript() 279 public void llResetScript()
244 { 280 {
245 m_host.AddScriptLPS(1); 281 m_host.AddScriptLPS(1);
@@ -302,6 +338,57 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
302 } 338 }
303 } 339 }
304 340
341 public List<ScenePresence> GetLinkAvatars(int linkType)
342 {
343 List<ScenePresence> ret = new List<ScenePresence>();
344 if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted)
345 return ret;
346
347 List<ScenePresence> avs = m_host.ParentGroup.GetLinkedAvatars();
348
349 switch (linkType)
350 {
351 case ScriptBaseClass.LINK_SET:
352 return avs;
353
354 case ScriptBaseClass.LINK_ROOT:
355 return ret;
356
357 case ScriptBaseClass.LINK_ALL_OTHERS:
358 return avs;
359
360 case ScriptBaseClass.LINK_ALL_CHILDREN:
361 return avs;
362
363 case ScriptBaseClass.LINK_THIS:
364 return ret;
365
366 default:
367 if (linkType < 0)
368 return ret;
369
370 int partCount = m_host.ParentGroup.GetPartCount();
371
372 if (linkType <= partCount)
373 {
374 return ret;
375 }
376 else
377 {
378 linkType = linkType - partCount;
379 if (linkType > avs.Count)
380 {
381 return ret;
382 }
383 else
384 {
385 ret.Add(avs[linkType-1]);
386 return ret;
387 }
388 }
389 }
390 }
391
305 /// <summary> 392 /// <summary>
306 /// Get a given link entity from a linkset (linked objects and any sitting avatars). 393 /// Get a given link entity from a linkset (linked objects and any sitting avatars).
307 /// </summary> 394 /// </summary>
@@ -384,6 +471,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
384 public static List<SceneObjectPart> GetLinkParts(SceneObjectPart part, int linkType) 471 public static List<SceneObjectPart> GetLinkParts(SceneObjectPart part, int linkType)
385 { 472 {
386 List<SceneObjectPart> ret = new List<SceneObjectPart>(); 473 List<SceneObjectPart> ret = new List<SceneObjectPart>();
474 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
475 return ret;
387 ret.Add(part); 476 ret.Add(part);
388 477
389 switch (linkType) 478 switch (linkType)
@@ -537,31 +626,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
537 626
538 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke 627 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke
539 628
540 /// <summary> 629 // Utility function for llRot2Euler
541 /// Convert an LSL rotation to a Euler vector. 630
542 /// </summary> 631 // normalize an angle between -PI and PI (-180 to +180 degrees)
543 /// <remarks> 632 protected double NormalizeAngle(double angle)
544 /// Using algorithm based off http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/quat_2_euler_paper_ver2-1.pdf
545 /// to avoid issues with singularity and rounding with Y rotation of +/- PI/2
546 /// </remarks>
547 /// <param name="r"></param>
548 /// <returns></returns>
549 public LSL_Vector llRot2Euler(LSL_Rotation r)
550 { 633 {
551 m_host.AddScriptLPS(1); 634 if (angle > -Math.PI && angle < Math.PI)
635 return angle;
552 636
553 LSL_Vector v = new LSL_Vector(0.0, 0.0, 1.0) * r; // Z axis unit vector unaffected by Z rotation component of r. 637 int numPis = (int)(Math.PI / angle);
554 double m = LSL_Vector.Mag(v); // Just in case v isn't normalized, need magnitude for Asin() operation later. 638 double remainder = angle - Math.PI * numPis;
555 if (m == 0.0) return new LSL_Vector(); 639 if (numPis % 2 == 1)
556 double x = Math.Atan2(-v.y, v.z); 640 return Math.PI - angle;
557 double sin = v.x / m; 641 return remainder;
558 if (sin < -0.999999 || sin > 0.999999) x = 0.0; // Force X rotation to 0 at the singularities. 642 }
559 double y = Math.Asin(sin);
560 // Rotate X axis unit vector by r and unwind the X and Y rotations leaving only the Z rotation
561 v = new LSL_Vector(1.0, 0.0, 0.0) * ((r * new LSL_Rotation(Math.Sin(-x / 2.0), 0.0, 0.0, Math.Cos(-x / 2.0))) * new LSL_Rotation(0.0, Math.Sin(-y / 2.0), 0.0, Math.Cos(-y / 2.0)));
562 double z = Math.Atan2(v.y, v.x);
563 643
564 return new LSL_Vector(x, y, z); 644 public LSL_Vector llRot2Euler(LSL_Rotation q1)
645 {
646 m_host.AddScriptLPS(1);
647 LSL_Vector eul = new LSL_Vector();
648
649 double sqw = q1.s*q1.s;
650 double sqx = q1.x*q1.x;
651 double sqy = q1.z*q1.z;
652 double sqz = q1.y*q1.y;
653 double unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor
654 double test = q1.x*q1.z + q1.y*q1.s;
655 if (test > 0.4999*unit) { // singularity at north pole
656 eul.z = 2 * Math.Atan2(q1.x,q1.s);
657 eul.y = Math.PI/2;
658 eul.x = 0;
659 return eul;
660 }
661 if (test < -0.4999*unit) { // singularity at south pole
662 eul.z = -2 * Math.Atan2(q1.x,q1.s);
663 eul.y = -Math.PI/2;
664 eul.x = 0;
665 return eul;
666 }
667 eul.z = Math.Atan2(2*q1.z*q1.s-2*q1.x*q1.y , sqx - sqy - sqz + sqw);
668 eul.y = Math.Asin(2*test/unit);
669 eul.x = Math.Atan2(2*q1.x*q1.s-2*q1.z*q1.y , -sqx + sqy - sqz + sqw);
670 return eul;
565 } 671 }
566 672
567 /* From wiki: 673 /* From wiki:
@@ -614,18 +720,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
614 m_host.AddScriptLPS(1); 720 m_host.AddScriptLPS(1);
615 721
616 double x,y,z,s; 722 double x,y,z,s;
617 723 v.x *= 0.5;
618 double c1 = Math.Cos(v.x * 0.5); 724 v.y *= 0.5;
619 double c2 = Math.Cos(v.y * 0.5); 725 v.z *= 0.5;
620 double c3 = Math.Cos(v.z * 0.5); 726 double c1 = Math.Cos(v.x);
621 double s1 = Math.Sin(v.x * 0.5); 727 double c2 = Math.Cos(v.y);
622 double s2 = Math.Sin(v.y * 0.5); 728 double c1c2 = c1 * c2;
623 double s3 = Math.Sin(v.z * 0.5); 729 double s1 = Math.Sin(v.x);
624 730 double s2 = Math.Sin(v.y);
625 x = s1 * c2 * c3 + c1 * s2 * s3; 731 double s1s2 = s1 * s2;
626 y = c1 * s2 * c3 - s1 * c2 * s3; 732 double c1s2 = c1 * s2;
627 z = s1 * s2 * c3 + c1 * c2 * s3; 733 double s1c2 = s1 * c2;
628 s = c1 * c2 * c3 - s1 * s2 * s3; 734 double c3 = Math.Cos(v.z);
735 double s3 = Math.Sin(v.z);
736
737 x = s1c2 * c3 + c1s2 * s3;
738 y = c1s2 * c3 - s1c2 * s3;
739 z = s1s2 * c3 + c1c2 * s3;
740 s = c1c2 * c3 - s1s2 * s3;
629 741
630 return new LSL_Rotation(x, y, z, s); 742 return new LSL_Rotation(x, y, z, s);
631 } 743 }
@@ -763,77 +875,76 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
763 { 875 {
764 //A and B should both be normalized 876 //A and B should both be normalized
765 m_host.AddScriptLPS(1); 877 m_host.AddScriptLPS(1);
766 LSL_Rotation rotBetween; 878 /* This method is more accurate than the SL one, and thus causes problems
767 // Check for zero vectors. If either is zero, return zero rotation. Otherwise, 879 for scripts that deal with the SL inaccuracy around 180-degrees -.- .._.
768 // continue calculation. 880
769 if (a == new LSL_Vector(0.0f, 0.0f, 0.0f) || b == new LSL_Vector(0.0f, 0.0f, 0.0f)) 881 double dotProduct = LSL_Vector.Dot(a, b);
770 { 882 LSL_Vector crossProduct = LSL_Vector.Cross(a, b);
771 rotBetween = new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f); 883 double magProduct = LSL_Vector.Mag(a) * LSL_Vector.Mag(b);
772 } 884 double angle = Math.Acos(dotProduct / magProduct);
773 else 885 LSL_Vector axis = LSL_Vector.Norm(crossProduct);
774 { 886 double s = Math.Sin(angle / 2);
775 a = LSL_Vector.Norm(a); 887
776 b = LSL_Vector.Norm(b); 888 double x = axis.x * s;
777 double dotProduct = LSL_Vector.Dot(a, b); 889 double y = axis.y * s;
778 // There are two degenerate cases possible. These are for vectors 180 or 890 double z = axis.z * s;
779 // 0 degrees apart. These have to be detected and handled individually. 891 double w = Math.Cos(angle / 2);
780 // 892
781 // Check for vectors 180 degrees apart. 893 if (Double.IsNaN(x) || Double.IsNaN(y) || Double.IsNaN(z) || Double.IsNaN(w))
782 // A dot product of -1 would mean the angle between vectors is 180 degrees. 894 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
783 if (dotProduct < -0.9999999f) 895
784 { 896 return new LSL_Rotation((float)x, (float)y, (float)z, (float)w);
785 // First assume X axis is orthogonal to the vectors. 897 */
786 LSL_Vector orthoVector = new LSL_Vector(1.0f, 0.0f, 0.0f); 898
787 orthoVector = orthoVector - a * (a.x / LSL_Vector.Dot(a, a)); 899 // This method mimics the 180 errors found in SL
788 // Check for near zero vector. A very small non-zero number here will create 900 // See www.euclideanspace.com... angleBetween
789 // a rotation in an undesired direction. 901 LSL_Vector vec_a = a;
790 if (LSL_Vector.Mag(orthoVector) > 0.0001) 902 LSL_Vector vec_b = b;
791 { 903
792 rotBetween = new LSL_Rotation(orthoVector.x, orthoVector.y, orthoVector.z, 0.0f); 904 // Eliminate zero length
793 } 905 LSL_Float vec_a_mag = LSL_Vector.Mag(vec_a);
794 // If the magnitude of the vector was near zero, then assume the X axis is not 906 LSL_Float vec_b_mag = LSL_Vector.Mag(vec_b);
795 // orthogonal and use the Z axis instead. 907 if (vec_a_mag < 0.00001 ||
796 else 908 vec_b_mag < 0.00001)
797 { 909 {
798 // Set 180 z rotation. 910 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
799 rotBetween = new LSL_Rotation(0.0f, 0.0f, 1.0f, 0.0f); 911 }
800 } 912
801 } 913 // Normalize
802 // Check for parallel vectors. 914 vec_a = llVecNorm(vec_a);
803 // A dot product of 1 would mean the angle between vectors is 0 degrees. 915 vec_b = llVecNorm(vec_b);
804 else if (dotProduct > 0.9999999f) 916
805 { 917 // Calculate axis and rotation angle
806 // Set zero rotation. 918 LSL_Vector axis = vec_a % vec_b;
807 rotBetween = new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f); 919 LSL_Float cos_theta = vec_a * vec_b;
808 } 920
809 else 921 // Check if parallel
810 { 922 if (cos_theta > 0.99999)
811 // All special checks have been performed so get the axis of rotation. 923 {
812 LSL_Vector crossProduct = LSL_Vector.Cross(a, b); 924 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
813 // Quarternion s value is the length of the unit vector + dot product. 925 }
814 double qs = 1.0 + dotProduct; 926
815 rotBetween = new LSL_Rotation(crossProduct.x, crossProduct.y, crossProduct.z, qs); 927 // Check if anti-parallel
816 // Normalize the rotation. 928 else if (cos_theta < -0.99999)
817 double mag = LSL_Rotation.Mag(rotBetween); 929 {
818 // We shouldn't have to worry about a divide by zero here. The qs value will be 930 LSL_Vector orthog_axis = new LSL_Vector(1.0, 0.0, 0.0) - (vec_a.x / (vec_a * vec_a) * vec_a);
819 // non-zero because we already know if we're here, then the dotProduct is not -1 so 931 if (LSL_Vector.Mag(orthog_axis) < 0.000001) orthog_axis = new LSL_Vector(0.0, 0.0, 1.0);
820 // qs will not be zero. Also, we've already handled the input vectors being zero so the 932 return new LSL_Rotation((float)orthog_axis.x, (float)orthog_axis.y, (float)orthog_axis.z, 0.0);
821 // crossProduct vector should also not be zero. 933 }
822 rotBetween.x = rotBetween.x / mag; 934 else // other rotation
823 rotBetween.y = rotBetween.y / mag; 935 {
824 rotBetween.z = rotBetween.z / mag; 936 LSL_Float theta = (LSL_Float)Math.Acos(cos_theta) * 0.5f;
825 rotBetween.s = rotBetween.s / mag; 937 axis = llVecNorm(axis);
826 // Check for undefined values and set zero rotation if any found. This code might not actually be required 938 double x, y, z, s, t;
827 // any longer since zero vectors are checked for at the top. 939 s = Math.Cos(theta);
828 if (Double.IsNaN(rotBetween.x) || Double.IsNaN(rotBetween.y) || Double.IsNaN(rotBetween.z) || Double.IsNaN(rotBetween.s)) 940 t = Math.Sin(theta);
829 { 941 x = axis.x * t;
830 rotBetween = new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f); 942 y = axis.y * t;
831 } 943 z = axis.z * t;
832 } 944 return new LSL_Rotation(x,y,z,s);
833 } 945 }
834 return rotBetween; 946 }
835 } 947
836
837 public void llWhisper(int channelID, string text) 948 public void llWhisper(int channelID, string text)
838 { 949 {
839 m_host.AddScriptLPS(1); 950 m_host.AddScriptLPS(1);
@@ -849,10 +960,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
849 wComm.DeliverMessage(ChatTypeEnum.Whisper, channelID, m_host.Name, m_host.UUID, text); 960 wComm.DeliverMessage(ChatTypeEnum.Whisper, channelID, m_host.Name, m_host.UUID, text);
850 } 961 }
851 962
963 private void CheckSayShoutTime()
964 {
965 DateTime now = DateTime.UtcNow;
966 if ((now - m_lastSayShoutCheck).Ticks > 10000000) // 1sec
967 {
968 m_lastSayShoutCheck = now;
969 m_SayShoutCount = 0;
970 }
971 else
972 m_SayShoutCount++;
973 }
974
852 public void llSay(int channelID, string text) 975 public void llSay(int channelID, string text)
853 { 976 {
854 m_host.AddScriptLPS(1); 977 m_host.AddScriptLPS(1);
855 978
979 if (channelID == 0)
980// m_SayShoutCount++;
981 CheckSayShoutTime();
982
983 if (m_SayShoutCount >= 11)
984 ScriptSleep(2000);
985
856 if (m_scriptConsoleChannelEnabled && (channelID == m_scriptConsoleChannel)) 986 if (m_scriptConsoleChannelEnabled && (channelID == m_scriptConsoleChannel))
857 { 987 {
858 Console.WriteLine(text); 988 Console.WriteLine(text);
@@ -875,6 +1005,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
875 { 1005 {
876 m_host.AddScriptLPS(1); 1006 m_host.AddScriptLPS(1);
877 1007
1008 if (channelID == 0)
1009// m_SayShoutCount++;
1010 CheckSayShoutTime();
1011
1012 if (m_SayShoutCount >= 11)
1013 ScriptSleep(2000);
1014
878 if (text.Length > 1023) 1015 if (text.Length > 1023)
879 text = text.Substring(0, 1023); 1016 text = text.Substring(0, 1023);
880 1017
@@ -906,22 +1043,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
906 1043
907 public void llRegionSayTo(string target, int channel, string msg) 1044 public void llRegionSayTo(string target, int channel, string msg)
908 { 1045 {
1046 string error = String.Empty;
1047
909 if (msg.Length > 1023) 1048 if (msg.Length > 1023)
910 msg = msg.Substring(0, 1023); 1049 msg = msg.Substring(0, 1023);
911 1050
912 m_host.AddScriptLPS(1); 1051 m_host.AddScriptLPS(1);
913 1052
914 if (channel == ScriptBaseClass.DEBUG_CHANNEL)
915 {
916 return;
917 }
918
919 UUID TargetID; 1053 UUID TargetID;
920 UUID.TryParse(target, out TargetID); 1054 UUID.TryParse(target, out TargetID);
921 1055
922 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 1056 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
923 if (wComm != null) 1057 if (wComm != null)
924 wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg); 1058 if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error))
1059 LSLError(error);
925 } 1060 }
926 1061
927 public LSL_Integer llListen(int channelID, string name, string ID, string msg) 1062 public LSL_Integer llListen(int channelID, string name, string ID, string msg)
@@ -1177,10 +1312,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1177 return detectedParams.TouchUV; 1312 return detectedParams.TouchUV;
1178 } 1313 }
1179 1314
1315 [DebuggerNonUserCode]
1180 public virtual void llDie() 1316 public virtual void llDie()
1181 { 1317 {
1182 m_host.AddScriptLPS(1); 1318 m_host.AddScriptLPS(1);
1183 throw new SelfDeleteException(); 1319 if (!m_host.ParentGroup.IsAttachment) throw new SelfDeleteException();
1184 } 1320 }
1185 1321
1186 public LSL_Float llGround(LSL_Vector offset) 1322 public LSL_Float llGround(LSL_Vector offset)
@@ -1251,6 +1387,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1251 1387
1252 public void llSetStatus(int status, int value) 1388 public void llSetStatus(int status, int value)
1253 { 1389 {
1390 if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted)
1391 return;
1254 m_host.AddScriptLPS(1); 1392 m_host.AddScriptLPS(1);
1255 1393
1256 int statusrotationaxis = 0; 1394 int statusrotationaxis = 0;
@@ -1274,6 +1412,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1274 if (!allow) 1412 if (!allow)
1275 return; 1413 return;
1276 1414
1415 if (m_host.ParentGroup.RootPart.PhysActor != null &&
1416 m_host.ParentGroup.RootPart.PhysActor.IsPhysical)
1417 return;
1418
1277 m_host.ScriptSetPhysicsStatus(true); 1419 m_host.ScriptSetPhysicsStatus(true);
1278 } 1420 }
1279 else 1421 else
@@ -1474,12 +1616,55 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1474 { 1616 {
1475 m_host.AddScriptLPS(1); 1617 m_host.AddScriptLPS(1);
1476 1618
1619 SetColor(m_host, color, face);
1620 }
1621
1622 protected void SetColor(SceneObjectPart part, LSL_Vector color, int face)
1623 {
1624 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1625 return;
1626
1627 Primitive.TextureEntry tex = part.Shape.Textures;
1628 Color4 texcolor;
1629 if (face >= 0 && face < GetNumberOfSides(part))
1630 {
1631 texcolor = tex.CreateFace((uint)face).RGBA;
1632 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
1633 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
1634 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
1635 tex.FaceTextures[face].RGBA = texcolor;
1636 part.UpdateTextureEntry(tex.GetBytes());
1637 return;
1638 }
1639 else if (face == ScriptBaseClass.ALL_SIDES)
1640 {
1641 for (uint i = 0; i < GetNumberOfSides(part); i++)
1642 {
1643 if (tex.FaceTextures[i] != null)
1644 {
1645 texcolor = tex.FaceTextures[i].RGBA;
1646 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
1647 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
1648 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
1649 tex.FaceTextures[i].RGBA = texcolor;
1650 }
1651 texcolor = tex.DefaultTexture.RGBA;
1652 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
1653 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
1654 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
1655 tex.DefaultTexture.RGBA = texcolor;
1656 }
1657 part.UpdateTextureEntry(tex.GetBytes());
1658 return;
1659 }
1660
1477 if (face == ScriptBaseClass.ALL_SIDES) 1661 if (face == ScriptBaseClass.ALL_SIDES)
1478 face = SceneObjectPart.ALL_SIDES; 1662 face = SceneObjectPart.ALL_SIDES;
1479 1663
1480 m_host.SetFaceColorAlpha(face, color, null); 1664 m_host.SetFaceColorAlpha(face, color, null);
1481 } 1665 }
1482 1666
1667 /*
1483 public void llSetContentType(LSL_Key id, LSL_Integer type) 1668 public void llSetContentType(LSL_Key id, LSL_Integer type)
1484 { 1669 {
1485 m_host.AddScriptLPS(1); 1670 m_host.AddScriptLPS(1);
@@ -1546,9 +1731,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1546 break; 1731 break;
1547 } 1732 }
1548 } 1733 }
1734 */
1549 1735
1550 public void SetTexGen(SceneObjectPart part, int face,int style) 1736 public void SetTexGen(SceneObjectPart part, int face,int style)
1551 { 1737 {
1738 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1739 return;
1740
1552 Primitive.TextureEntry tex = part.Shape.Textures; 1741 Primitive.TextureEntry tex = part.Shape.Textures;
1553 MappingType textype; 1742 MappingType textype;
1554 textype = MappingType.Default; 1743 textype = MappingType.Default;
@@ -1579,6 +1768,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1579 1768
1580 public void SetGlow(SceneObjectPart part, int face, float glow) 1769 public void SetGlow(SceneObjectPart part, int face, float glow)
1581 { 1770 {
1771 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1772 return;
1773
1582 Primitive.TextureEntry tex = part.Shape.Textures; 1774 Primitive.TextureEntry tex = part.Shape.Textures;
1583 if (face >= 0 && face < GetNumberOfSides(part)) 1775 if (face >= 0 && face < GetNumberOfSides(part))
1584 { 1776 {
@@ -1604,6 +1796,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1604 1796
1605 public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump) 1797 public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump)
1606 { 1798 {
1799 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1800 return;
1607 1801
1608 Shininess sval = new Shininess(); 1802 Shininess sval = new Shininess();
1609 1803
@@ -1654,6 +1848,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1654 1848
1655 public void SetFullBright(SceneObjectPart part, int face, bool bright) 1849 public void SetFullBright(SceneObjectPart part, int face, bool bright)
1656 { 1850 {
1851 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1852 return;
1853
1657 Primitive.TextureEntry tex = part.Shape.Textures; 1854 Primitive.TextureEntry tex = part.Shape.Textures;
1658 if (face >= 0 && face < GetNumberOfSides(part)) 1855 if (face >= 0 && face < GetNumberOfSides(part))
1659 { 1856 {
@@ -1714,13 +1911,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1714 m_host.AddScriptLPS(1); 1911 m_host.AddScriptLPS(1);
1715 1912
1716 List<SceneObjectPart> parts = GetLinkParts(linknumber); 1913 List<SceneObjectPart> parts = GetLinkParts(linknumber);
1717 1914 if (parts.Count > 0)
1718 foreach (SceneObjectPart part in parts) 1915 {
1719 SetAlpha(part, alpha, face); 1916 try
1917 {
1918 foreach (SceneObjectPart part in parts)
1919 SetAlpha(part, alpha, face);
1920 }
1921 finally
1922 {
1923 }
1924 }
1720 } 1925 }
1721 1926
1722 protected void SetAlpha(SceneObjectPart part, double alpha, int face) 1927 protected void SetAlpha(SceneObjectPart part, double alpha, int face)
1723 { 1928 {
1929 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1930 return;
1931
1724 Primitive.TextureEntry tex = part.Shape.Textures; 1932 Primitive.TextureEntry tex = part.Shape.Textures;
1725 Color4 texcolor; 1933 Color4 texcolor;
1726 if (face >= 0 && face < GetNumberOfSides(part)) 1934 if (face >= 0 && face < GetNumberOfSides(part))
@@ -1773,7 +1981,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1773 protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction, 1981 protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction,
1774 float wind, float tension, LSL_Vector Force) 1982 float wind, float tension, LSL_Vector Force)
1775 { 1983 {
1776 if (part == null) 1984 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1777 return; 1985 return;
1778 1986
1779 if (flexi) 1987 if (flexi)
@@ -1814,7 +2022,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1814 /// <param name="falloff"></param> 2022 /// <param name="falloff"></param>
1815 protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff) 2023 protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff)
1816 { 2024 {
1817 if (part == null) 2025 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1818 return; 2026 return;
1819 2027
1820 if (light) 2028 if (light)
@@ -1847,11 +2055,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1847 Primitive.TextureEntry tex = part.Shape.Textures; 2055 Primitive.TextureEntry tex = part.Shape.Textures;
1848 Color4 texcolor; 2056 Color4 texcolor;
1849 LSL_Vector rgb = new LSL_Vector(); 2057 LSL_Vector rgb = new LSL_Vector();
2058 int nsides = GetNumberOfSides(part);
2059
1850 if (face == ScriptBaseClass.ALL_SIDES) 2060 if (face == ScriptBaseClass.ALL_SIDES)
1851 { 2061 {
1852 int i; 2062 int i;
1853 2063 for (i = 0; i < nsides; i++)
1854 for (i = 0 ; i < GetNumberOfSides(part); i++)
1855 { 2064 {
1856 texcolor = tex.GetFace((uint)i).RGBA; 2065 texcolor = tex.GetFace((uint)i).RGBA;
1857 rgb.x += texcolor.R; 2066 rgb.x += texcolor.R;
@@ -1859,14 +2068,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1859 rgb.z += texcolor.B; 2068 rgb.z += texcolor.B;
1860 } 2069 }
1861 2070
1862 rgb.x /= (float)GetNumberOfSides(part); 2071 float invnsides = 1.0f / (float)nsides;
1863 rgb.y /= (float)GetNumberOfSides(part); 2072
1864 rgb.z /= (float)GetNumberOfSides(part); 2073 rgb.x *= invnsides;
2074 rgb.y *= invnsides;
2075 rgb.z *= invnsides;
1865 2076
1866 return rgb; 2077 return rgb;
1867 } 2078 }
1868 2079 if (face >= 0 && face < nsides)
1869 if (face >= 0 && face < GetNumberOfSides(part))
1870 { 2080 {
1871 texcolor = tex.GetFace((uint)face).RGBA; 2081 texcolor = tex.GetFace((uint)face).RGBA;
1872 rgb.x = texcolor.R; 2082 rgb.x = texcolor.R;
@@ -1893,15 +2103,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1893 m_host.AddScriptLPS(1); 2103 m_host.AddScriptLPS(1);
1894 2104
1895 List<SceneObjectPart> parts = GetLinkParts(linknumber); 2105 List<SceneObjectPart> parts = GetLinkParts(linknumber);
1896 2106 if (parts.Count > 0)
1897 foreach (SceneObjectPart part in parts) 2107 {
1898 SetTexture(part, texture, face); 2108 try
1899 2109 {
2110 foreach (SceneObjectPart part in parts)
2111 SetTexture(part, texture, face);
2112 }
2113 finally
2114 {
2115 }
2116 }
1900 ScriptSleep(200); 2117 ScriptSleep(200);
1901 } 2118 }
1902 2119
1903 protected void SetTexture(SceneObjectPart part, string texture, int face) 2120 protected void SetTexture(SceneObjectPart part, string texture, int face)
1904 { 2121 {
2122 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2123 return;
2124
1905 UUID textureID = new UUID(); 2125 UUID textureID = new UUID();
1906 2126
1907 textureID = ScriptUtils.GetAssetIdFromItemName(m_host, texture, (int)AssetType.Texture); 2127 textureID = ScriptUtils.GetAssetIdFromItemName(m_host, texture, (int)AssetType.Texture);
@@ -1946,6 +2166,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1946 2166
1947 protected void ScaleTexture(SceneObjectPart part, double u, double v, int face) 2167 protected void ScaleTexture(SceneObjectPart part, double u, double v, int face)
1948 { 2168 {
2169 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2170 return;
2171
1949 Primitive.TextureEntry tex = part.Shape.Textures; 2172 Primitive.TextureEntry tex = part.Shape.Textures;
1950 if (face >= 0 && face < GetNumberOfSides(part)) 2173 if (face >= 0 && face < GetNumberOfSides(part))
1951 { 2174 {
@@ -1982,6 +2205,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1982 2205
1983 protected void OffsetTexture(SceneObjectPart part, double u, double v, int face) 2206 protected void OffsetTexture(SceneObjectPart part, double u, double v, int face)
1984 { 2207 {
2208 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2209 return;
2210
1985 Primitive.TextureEntry tex = part.Shape.Textures; 2211 Primitive.TextureEntry tex = part.Shape.Textures;
1986 if (face >= 0 && face < GetNumberOfSides(part)) 2212 if (face >= 0 && face < GetNumberOfSides(part))
1987 { 2213 {
@@ -2018,6 +2244,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2018 2244
2019 protected void RotateTexture(SceneObjectPart part, double rotation, int face) 2245 protected void RotateTexture(SceneObjectPart part, double rotation, int face)
2020 { 2246 {
2247 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2248 return;
2249
2021 Primitive.TextureEntry tex = part.Shape.Textures; 2250 Primitive.TextureEntry tex = part.Shape.Textures;
2022 if (face >= 0 && face < GetNumberOfSides(part)) 2251 if (face >= 0 && face < GetNumberOfSides(part))
2023 { 2252 {
@@ -2159,7 +2388,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2159 return end; 2388 return end;
2160 } 2389 }
2161 2390
2162 protected LSL_Vector GetSetPosTarget(SceneObjectPart part, LSL_Vector targetPos, LSL_Vector fromPos) 2391 protected LSL_Vector GetSetPosTarget(SceneObjectPart part, LSL_Vector targetPos, LSL_Vector fromPos, bool adjust)
2163 { 2392 {
2164 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 2393 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2165 return fromPos; 2394 return fromPos;
@@ -2175,9 +2404,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2175 if ((targetPos.z < ground) && disable_underground_movement && m_host.ParentGroup.AttachmentPoint == 0) 2404 if ((targetPos.z < ground) && disable_underground_movement && m_host.ParentGroup.AttachmentPoint == 0)
2176 targetPos.z = ground; 2405 targetPos.z = ground;
2177 } 2406 }
2178 LSL_Vector real_vec = SetPosAdjust(fromPos, targetPos); 2407 if (adjust)
2408 return SetPosAdjust(fromPos, targetPos);
2179 2409
2180 return real_vec; 2410 return targetPos;
2181 } 2411 }
2182 2412
2183 /// <summary> 2413 /// <summary>
@@ -2188,27 +2418,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2188 /// <param name="adjust">if TRUE, will cap the distance to 10m.</param> 2418 /// <param name="adjust">if TRUE, will cap the distance to 10m.</param>
2189 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos, bool adjust) 2419 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos, bool adjust)
2190 { 2420 {
2191 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 2421 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2422 return;
2423
2192 LSL_Vector currentPos = GetPartLocalPos(part); 2424 LSL_Vector currentPos = GetPartLocalPos(part);
2425 LSL_Vector toPos = GetSetPosTarget(part, targetPos, currentPos, adjust);
2193 2426
2194 float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y);
2195 bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true);
2196 2427
2197 if (part.ParentGroup.RootPart == part) 2428 if (part.ParentGroup.RootPart == part)
2198 { 2429 {
2199 if ((targetPos.z < ground) && disable_underground_movement && m_host.ParentGroup.AttachmentPoint == 0)
2200 targetPos.z = ground;
2201 SceneObjectGroup parent = part.ParentGroup; 2430 SceneObjectGroup parent = part.ParentGroup;
2202 parent.UpdateGroupPosition(!adjust ? targetPos : 2431 if (!World.Permissions.CanObjectEntry(parent.UUID, false, (Vector3)toPos))
2203 SetPosAdjust(currentPos, targetPos)); 2432 return;
2433 Util.FireAndForget(delegate(object x) {
2434 parent.UpdateGroupPosition((Vector3)toPos);
2435 });
2204 } 2436 }
2205 else 2437 else
2206 { 2438 {
2207 part.OffsetPosition = !adjust ? targetPos : 2439 part.OffsetPosition = (Vector3)toPos;
2208 SetPosAdjust(currentPos, targetPos); 2440// SceneObjectGroup parent = part.ParentGroup;
2209 SceneObjectGroup parent = part.ParentGroup; 2441// parent.HasGroupChanged = true;
2210 parent.HasGroupChanged = true; 2442// parent.ScheduleGroupForTerseUpdate();
2211 parent.ScheduleGroupForTerseUpdate(); 2443 part.ScheduleTerseUpdate();
2212 } 2444 }
2213 } 2445 }
2214 2446
@@ -2237,13 +2469,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2237 else 2469 else
2238 { 2470 {
2239 if (part.ParentGroup.IsAttachment) 2471 if (part.ParentGroup.IsAttachment)
2240 {
2241 pos = part.AttachedPos; 2472 pos = part.AttachedPos;
2242 }
2243 else 2473 else
2244 {
2245 pos = part.AbsolutePosition; 2474 pos = part.AbsolutePosition;
2246 }
2247 } 2475 }
2248 2476
2249// m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos); 2477// m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos);
@@ -2255,8 +2483,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2255 { 2483 {
2256 m_host.AddScriptLPS(1); 2484 m_host.AddScriptLPS(1);
2257 2485
2486
2487 // Teravus: if (m_host.ParentID == 0) is bug code because the ParentID for the Avatar will cause this to be nonzero for root prim attachments
2488 // which is then treated like a child prim rotation and it's offset gets cumulatively multiplied against.
2489 // to fix the scripted rotations we also have to check to see if the root part localid is the same as the host's localid.
2490 // RootPart != null should shortcircuit
2491
2258 // try to let this work as in SL... 2492 // try to let this work as in SL...
2259 if (m_host.ParentID == 0) 2493 if (m_host.ParentID == 0 || (m_host.ParentGroup != null && m_host == m_host.ParentGroup.RootPart))
2260 { 2494 {
2261 // special case: If we are root, rotate complete SOG to new rotation 2495 // special case: If we are root, rotate complete SOG to new rotation
2262 SetRot(m_host, rot); 2496 SetRot(m_host, rot);
@@ -2283,25 +2517,46 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2283 2517
2284 protected void SetRot(SceneObjectPart part, Quaternion rot) 2518 protected void SetRot(SceneObjectPart part, Quaternion rot)
2285 { 2519 {
2286 part.UpdateRotation(rot); 2520 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2287 // Update rotation does not move the object in the physics scene if it's a linkset. 2521 return;
2288 2522
2289//KF: Do NOT use this next line if using ODE physics engine. This need a switch based on .ini Phys Engine type 2523 bool isroot = (part == part.ParentGroup.RootPart);
2290// part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition; 2524 bool isphys;
2291 2525
2292 // So, after thinking about this for a bit, the issue with the part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition line
2293 // is it isn't compatible with vehicles because it causes the vehicle body to have to be broken down and rebuilt
2294 // It's perfectly okay when the object is not an active physical body though.
2295 // So, part.ParentGroup.ResetChildPrimPhysicsPositions(); does the thing that Kitto is warning against
2296 // but only if the object is not physial and active. This is important for rotating doors.
2297 // without the absoluteposition = absoluteposition happening, the doors do not move in the physics
2298 // scene
2299 PhysicsActor pa = part.PhysActor; 2526 PhysicsActor pa = part.PhysActor;
2300 2527
2301 if (pa != null && !pa.IsPhysical) 2528 // keep using physactor ideia of isphysical
2529 // it should be SOP ideia of that
2530 // not much of a issue with ubitODE
2531 if (pa != null && pa.IsPhysical)
2532 isphys = true;
2533 else
2534 isphys = false;
2535
2536 // SL doesn't let scripts rotate root of physical linksets
2537 if (isroot && isphys)
2538 return;
2539
2540 part.UpdateRotation(rot);
2541
2542 // Update rotation does not move the object in the physics engine if it's a non physical linkset
2543 // so do a nasty update of parts positions if is a root part rotation
2544 if (isroot && pa != null) // with if above implies non physical root part
2302 { 2545 {
2303 part.ParentGroup.ResetChildPrimPhysicsPositions(); 2546 part.ParentGroup.ResetChildPrimPhysicsPositions();
2304 } 2547 }
2548 else // fix sitting avatars. This is only needed bc of how we link avas to child parts, not root part
2549 {
2550 List<ScenePresence> sittingavas = part.ParentGroup.GetLinkedAvatars();
2551 if (sittingavas.Count > 0)
2552 {
2553 foreach (ScenePresence av in sittingavas)
2554 {
2555 if (isroot || part.LocalId == av.ParentID)
2556 av.SendTerseUpdateToAllClients();
2557 }
2558 }
2559 }
2305 } 2560 }
2306 2561
2307 /// <summary> 2562 /// <summary>
@@ -2318,6 +2573,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2318 2573
2319 m_host.AddScriptLPS(1); 2574 m_host.AddScriptLPS(1);
2320 Quaternion q = m_host.GetWorldRotation(); 2575 Quaternion q = m_host.GetWorldRotation();
2576
2577 if (m_host.ParentGroup != null && m_host.ParentGroup.AttachmentPoint != 0)
2578 {
2579 ScenePresence avatar = World.GetScenePresence(m_host.ParentGroup.AttachedAvatar);
2580 if (avatar != null)
2581 {
2582 if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
2583 q = avatar.CameraRotation * q; // Mouselook
2584 else
2585 q = avatar.Rotation * q; // Currently infrequently updated so may be inaccurate
2586 }
2587 }
2588
2321 return new LSL_Rotation(q.X, q.Y, q.Z, q.W); 2589 return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
2322 } 2590 }
2323 2591
@@ -2345,14 +2613,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2345 return new LSL_Rotation(q); 2613 return new LSL_Rotation(q);
2346 } 2614 }
2347 2615
2348 return new LSL_Rotation(part.GetWorldRotation()); 2616 q = part.GetWorldRotation();
2617 if (part.ParentGroup.AttachmentPoint != 0)
2618 {
2619 ScenePresence avatar = World.GetScenePresence(part.ParentGroup.AttachedAvatar);
2620 if (avatar != null)
2621 {
2622 if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
2623 q = avatar.CameraRotation * q; // Mouselook
2624 else
2625 q = avatar.Rotation * q; // Currently infrequently updated so may be inaccurate
2626 }
2627 }
2628
2629 return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
2349 } 2630 }
2350 2631
2351 public LSL_Rotation llGetLocalRot() 2632 public LSL_Rotation llGetLocalRot()
2352 { 2633 {
2353 m_host.AddScriptLPS(1); 2634 return GetPartLocalRot(m_host);
2635 }
2354 2636
2355 return new LSL_Rotation(m_host.RotationOffset); 2637 private LSL_Rotation GetPartLocalRot(SceneObjectPart part)
2638 {
2639 m_host.AddScriptLPS(1);
2640 Quaternion rot = part.RotationOffset;
2641 return new LSL_Rotation(rot.X, rot.Y, rot.Z, rot.W);
2356 } 2642 }
2357 2643
2358 public void llSetForce(LSL_Vector force, int local) 2644 public void llSetForce(LSL_Vector force, int local)
@@ -2432,16 +2718,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2432 m_host.ApplyImpulse(v, local != 0); 2718 m_host.ApplyImpulse(v, local != 0);
2433 } 2719 }
2434 2720
2721
2435 public void llApplyRotationalImpulse(LSL_Vector force, int local) 2722 public void llApplyRotationalImpulse(LSL_Vector force, int local)
2436 { 2723 {
2437 m_host.AddScriptLPS(1); 2724 m_host.AddScriptLPS(1);
2438 m_host.ApplyAngularImpulse(force, local != 0); 2725 m_host.ParentGroup.RootPart.ApplyAngularImpulse(force, local != 0);
2439 } 2726 }
2440 2727
2441 public void llSetTorque(LSL_Vector torque, int local) 2728 public void llSetTorque(LSL_Vector torque, int local)
2442 { 2729 {
2443 m_host.AddScriptLPS(1); 2730 m_host.AddScriptLPS(1);
2444 m_host.SetAngularImpulse(torque, local != 0); 2731 m_host.ParentGroup.RootPart.SetAngularImpulse(torque, local != 0);
2445 } 2732 }
2446 2733
2447 public LSL_Vector llGetTorque() 2734 public LSL_Vector llGetTorque()
@@ -2458,20 +2745,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2458 llSetTorque(torque, local); 2745 llSetTorque(torque, local);
2459 } 2746 }
2460 2747
2748 public void llSetVelocity(LSL_Vector vel, int local)
2749 {
2750 m_host.AddScriptLPS(1);
2751 m_host.SetVelocity(new Vector3((float)vel.x, (float)vel.y, (float)vel.z), local != 0);
2752 }
2753
2461 public LSL_Vector llGetVel() 2754 public LSL_Vector llGetVel()
2462 { 2755 {
2463 m_host.AddScriptLPS(1); 2756 m_host.AddScriptLPS(1);
2464 2757
2465 Vector3 vel; 2758 Vector3 vel = Vector3.Zero;
2466 2759
2467 if (m_host.ParentGroup.IsAttachment) 2760 if (m_host.ParentGroup.IsAttachment)
2468 { 2761 {
2469 ScenePresence avatar = m_host.ParentGroup.Scene.GetScenePresence(m_host.ParentGroup.AttachedAvatar); 2762 ScenePresence avatar = m_host.ParentGroup.Scene.GetScenePresence(m_host.ParentGroup.AttachedAvatar);
2470 vel = avatar.Velocity; 2763 if (avatar != null)
2764 vel = avatar.Velocity;
2471 } 2765 }
2472 else 2766 else
2473 { 2767 {
2474 vel = m_host.Velocity; 2768 vel = m_host.ParentGroup.RootPart.Velocity;
2475 } 2769 }
2476 2770
2477 return new LSL_Vector(vel); 2771 return new LSL_Vector(vel);
@@ -2484,11 +2778,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2484 return new LSL_Vector(m_host.Acceleration); 2778 return new LSL_Vector(m_host.Acceleration);
2485 } 2779 }
2486 2780
2487 public LSL_Vector llGetOmega() 2781 public void llSetAngularVelocity(LSL_Vector avel, int local)
2488 { 2782 {
2489 m_host.AddScriptLPS(1); 2783 m_host.AddScriptLPS(1);
2784 m_host.SetAngularVelocity(new Vector3((float)avel.x, (float)avel.y, (float)avel.z), local != 0);
2785 }
2490 2786
2491 return new LSL_Vector(m_host.AngularVelocity); 2787 public LSL_Vector llGetOmega()
2788 {
2789 m_host.AddScriptLPS(1);
2790 Vector3 avel = m_host.AngularVelocity;
2791 return new LSL_Vector(avel.X, avel.Y, avel.Z);
2492 } 2792 }
2493 2793
2494 public LSL_Float llGetTimeOfDay() 2794 public LSL_Float llGetTimeOfDay()
@@ -2849,7 +3149,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2849 return src.ToLower(); 3149 return src.ToLower();
2850 } 3150 }
2851 3151
2852 public void llGiveMoney(string destination, int amount) 3152 public LSL_Integer llGiveMoney(string destination, int amount)
2853 { 3153 {
2854 Util.FireAndForget(x => 3154 Util.FireAndForget(x =>
2855 { 3155 {
@@ -2880,9 +3180,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2880 return; 3180 return;
2881 } 3181 }
2882 3182
3183 string reason;
2883 money.ObjectGiveMoney( 3184 money.ObjectGiveMoney(
2884 m_host.ParentGroup.RootPart.UUID, m_host.ParentGroup.RootPart.OwnerID, toID, amount); 3185 m_host.ParentGroup.RootPart.UUID, m_host.ParentGroup.RootPart.OwnerID, toID, amount,UUID.Zero, out reason);
2885 }); 3186 });
3187
3188 return 0;
2886 } 3189 }
2887 3190
2888 public void llMakeExplosion(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset) 3191 public void llMakeExplosion(int particles, double scale, double vel, double lifetime, double arc, string texture, LSL_Vector offset)
@@ -2961,13 +3264,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2961 new_group.RootPart.UUID.ToString()) }, 3264 new_group.RootPart.UUID.ToString()) },
2962 new DetectParams[0])); 3265 new DetectParams[0]));
2963 3266
2964 float groupmass = new_group.GetMass(); 3267 // do recoil
3268 SceneObjectGroup hostgrp = m_host.ParentGroup;
3269 if (hostgrp == null)
3270 return;
3271
3272 if (hostgrp.IsAttachment) // don't recoil avatars
3273 return;
2965 3274
2966 PhysicsActor pa = new_group.RootPart.PhysActor; 3275 PhysicsActor pa = new_group.RootPart.PhysActor;
2967 3276
2968 //Recoil. 3277 //Recoil.
2969 if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero) 3278 if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero)
2970 { 3279 {
3280 float groupmass = new_group.GetMass();
2971 Vector3 recoil = -vel * groupmass * m_recoilScaleFactor; 3281 Vector3 recoil = -vel * groupmass * m_recoilScaleFactor;
2972 if (recoil != Vector3.Zero) 3282 if (recoil != Vector3.Zero)
2973 { 3283 {
@@ -2975,6 +3285,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2975 } 3285 }
2976 } 3286 }
2977 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) 3287 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3288 return;
3289
2978 }); 3290 });
2979 3291
2980 //ScriptSleep((int)((groupmass * velmag) / 10)); 3292 //ScriptSleep((int)((groupmass * velmag) / 10));
@@ -2989,35 +3301,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2989 public void llLookAt(LSL_Vector target, double strength, double damping) 3301 public void llLookAt(LSL_Vector target, double strength, double damping)
2990 { 3302 {
2991 m_host.AddScriptLPS(1); 3303 m_host.AddScriptLPS(1);
2992 // Determine where we are looking from
2993 LSL_Vector from = llGetPos();
2994
2995 // Work out the normalised vector from the source to the target
2996 LSL_Vector delta = llVecNorm(target - from);
2997 LSL_Vector angle = new LSL_Vector(0,0,0);
2998 3304
2999 // Calculate the yaw 3305 // Get the normalized vector to the target
3000 // subtracting PI_BY_TWO is required to compensate for the odd SL co-ordinate system 3306 LSL_Vector d1 = llVecNorm(target - llGetPos());
3001 angle.x = llAtan2(delta.z, delta.y) - ScriptBaseClass.PI_BY_TWO;
3002 3307
3003 // Calculate pitch 3308 // Get the bearing (yaw)
3004 angle.y = llAtan2(delta.x, llSqrt((delta.y * delta.y) + (delta.z * delta.z))); 3309 LSL_Vector a1 = new LSL_Vector(0,0,0);
3310 a1.z = llAtan2(d1.y, d1.x);
3005 3311
3006 // we need to convert from a vector describing 3312 // Get the elevation (pitch)
3007 // the angles of rotation in radians into rotation value 3313 LSL_Vector a2 = new LSL_Vector(0,0,0);
3008 LSL_Rotation rot = llEuler2Rot(angle); 3314 a2.y= -llAtan2(d1.z, llSqrt((d1.x * d1.x) + (d1.y * d1.y)));
3009 3315
3010 // Per discussion with Melanie, for non-physical objects llLookAt appears to simply 3316 LSL_Rotation r1 = llEuler2Rot(a1);
3011 // set the rotation of the object, copy that behavior 3317 LSL_Rotation r2 = llEuler2Rot(a2);
3012 PhysicsActor pa = m_host.PhysActor; 3318 LSL_Rotation r3 = new LSL_Rotation(0.000000, 0.707107, 0.000000, 0.707107);
3013 3319
3014 if (strength == 0 || pa == null || !pa.IsPhysical) 3320 if (m_host.PhysActor == null || !m_host.PhysActor.IsPhysical)
3015 { 3321 {
3016 llSetRot(rot); 3322 // Do nothing if either value is 0 (this has been checked in SL)
3323 if (strength <= 0.0 || damping <= 0.0)
3324 return;
3325
3326 llSetRot(r3 * r2 * r1);
3017 } 3327 }
3018 else 3328 else
3019 { 3329 {
3020 m_host.StartLookAt(rot, (float)strength, (float)damping); 3330 if (strength == 0)
3331 {
3332 llSetRot(r3 * r2 * r1);
3333 return;
3334 }
3335
3336 m_host.StartLookAt((Quaternion)(r3 * r2 * r1), (float)strength, (float)damping);
3021 } 3337 }
3022 } 3338 }
3023 3339
@@ -3064,17 +3380,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3064 } 3380 }
3065 else 3381 else
3066 { 3382 {
3067 if (m_host.IsRoot) 3383 // new SL always returns object mass
3068 { 3384// if (m_host.IsRoot)
3385// {
3069 return m_host.ParentGroup.GetMass(); 3386 return m_host.ParentGroup.GetMass();
3070 } 3387// }
3071 else 3388// else
3072 { 3389// {
3073 return m_host.GetMass(); 3390// return m_host.GetMass();
3074 } 3391// }
3075 } 3392 }
3076 } 3393 }
3077 3394
3395
3396 public LSL_Float llGetMassMKS()
3397 {
3398 return 100f * llGetMass();
3399 }
3400
3078 public void llCollisionFilter(string name, string id, int accept) 3401 public void llCollisionFilter(string name, string id, int accept)
3079 { 3402 {
3080 m_host.AddScriptLPS(1); 3403 m_host.AddScriptLPS(1);
@@ -3122,8 +3445,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3122 { 3445 {
3123 // Unregister controls from Presence 3446 // Unregister controls from Presence
3124 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID); 3447 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3125 // Remove Take Control permission.
3126 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3127 } 3448 }
3128 } 3449 }
3129 } 3450 }
@@ -3151,7 +3472,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3151 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3472 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3152 3473
3153 if (attachmentsModule != null) 3474 if (attachmentsModule != null)
3154 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false, true, true); 3475 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false, true, false, true);
3155 else 3476 else
3156 return false; 3477 return false;
3157 } 3478 }
@@ -3181,9 +3502,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3181 { 3502 {
3182 m_host.AddScriptLPS(1); 3503 m_host.AddScriptLPS(1);
3183 3504
3184// if (m_host.ParentGroup.RootPart.AttachmentPoint == 0)
3185// return;
3186
3187 if (m_item.PermsGranter != m_host.OwnerID) 3505 if (m_item.PermsGranter != m_host.OwnerID)
3188 return; 3506 return;
3189 3507
@@ -3226,6 +3544,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3226 3544
3227 public void llInstantMessage(string user, string message) 3545 public void llInstantMessage(string user, string message)
3228 { 3546 {
3547 UUID result;
3548 if (!UUID.TryParse(user, out result) || result == UUID.Zero)
3549 {
3550 ShoutError("An invalid key was passed to llInstantMessage");
3551 ScriptSleep(2000);
3552 return;
3553 }
3554
3555
3229 m_host.AddScriptLPS(1); 3556 m_host.AddScriptLPS(1);
3230 3557
3231 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. 3558 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance.
@@ -3240,14 +3567,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3240 UUID friendTransactionID = UUID.Random(); 3567 UUID friendTransactionID = UUID.Random();
3241 3568
3242 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); 3569 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID);
3243 3570
3244 GridInstantMessage msg = new GridInstantMessage(); 3571 GridInstantMessage msg = new GridInstantMessage();
3245 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid; 3572 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid;
3246 msg.toAgentID = new Guid(user); // toAgentID.Guid; 3573 msg.toAgentID = new Guid(user); // toAgentID.Guid;
3247 msg.imSessionID = new Guid(friendTransactionID.ToString()); // This is the item we're mucking with here 3574 msg.imSessionID = new Guid(friendTransactionID.ToString()); // This is the item we're mucking with here
3248// m_log.Debug("[Scripting IM]: From:" + msg.fromAgentID.ToString() + " To: " + msg.toAgentID.ToString() + " Session:" + msg.imSessionID.ToString() + " Message:" + message); 3575// m_log.Debug("[Scripting IM]: From:" + msg.fromAgentID.ToString() + " To: " + msg.toAgentID.ToString() + " Session:" + msg.imSessionID.ToString() + " Message:" + message);
3249// m_log.Debug("[Scripting IM]: Filling Session: " + msg.imSessionID.ToString()); 3576// m_log.Debug("[Scripting IM]: Filling Session: " + msg.imSessionID.ToString());
3250 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();// timestamp; 3577// DateTime dt = DateTime.UtcNow;
3578//
3579// // Ticks from UtcNow, but make it look like local. Evil, huh?
3580// dt = DateTime.SpecifyKind(dt, DateTimeKind.Local);
3581//
3582// try
3583// {
3584// // Convert that to the PST timezone
3585// TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("America/Los_Angeles");
3586// dt = TimeZoneInfo.ConvertTime(dt, timeZoneInfo);
3587// }
3588// catch
3589// {
3590// // No logging here, as it could be VERY spammy
3591// }
3592//
3593// // And make it look local again to fool the unix time util
3594// dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc);
3595
3596 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
3597
3251 //if (client != null) 3598 //if (client != null)
3252 //{ 3599 //{
3253 msg.fromAgentName = m_host.Name;//client.FirstName + " " + client.LastName;// fromAgentName; 3600 msg.fromAgentName = m_host.Name;//client.FirstName + " " + client.LastName;// fromAgentName;
@@ -3261,10 +3608,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3261 msg.message = message.Substring(0, 1024); 3608 msg.message = message.Substring(0, 1024);
3262 else 3609 else
3263 msg.message = message; 3610 msg.message = message;
3264 msg.dialog = (byte)19; // messgage from script ??? // dialog; 3611 msg.dialog = (byte)19; // MessageFromObject
3265 msg.fromGroup = false;// fromGroup; 3612 msg.fromGroup = false;// fromGroup;
3266 msg.offline = (byte)0; //offline; 3613 msg.offline = (byte)0; //offline;
3267 msg.ParentEstateID = 0; //ParentEstateID; 3614 msg.ParentEstateID = World.RegionInfo.EstateSettings.EstateID;
3268 msg.Position = new Vector3(m_host.AbsolutePosition); 3615 msg.Position = new Vector3(m_host.AbsolutePosition);
3269 msg.RegionID = World.RegionInfo.RegionID.Guid;//RegionID.Guid; 3616 msg.RegionID = World.RegionInfo.RegionID.Guid;//RegionID.Guid;
3270 3617
@@ -3296,7 +3643,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3296 } 3643 }
3297 3644
3298 emailModule.SendEmail(m_host.UUID, address, subject, message); 3645 emailModule.SendEmail(m_host.UUID, address, subject, message);
3299 llSleep(EMAIL_PAUSE_TIME); 3646 ScriptSleep(EMAIL_PAUSE_TIME * 1000);
3300 } 3647 }
3301 3648
3302 public void llGetNextEmail(string address, string subject) 3649 public void llGetNextEmail(string address, string subject)
@@ -3542,7 +3889,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3542 implicitPerms = ScriptBaseClass.PERMISSION_TAKE_CONTROLS | 3889 implicitPerms = ScriptBaseClass.PERMISSION_TAKE_CONTROLS |
3543 ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION | 3890 ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION |
3544 ScriptBaseClass.PERMISSION_CONTROL_CAMERA | 3891 ScriptBaseClass.PERMISSION_CONTROL_CAMERA |
3892 ScriptBaseClass.PERMISSION_TRACK_CAMERA |
3545 ScriptBaseClass.PERMISSION_ATTACH; 3893 ScriptBaseClass.PERMISSION_ATTACH;
3894
3546 } 3895 }
3547 else 3896 else
3548 { 3897 {
@@ -3559,15 +3908,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3559 if (World.GetExtraSetting("auto_grant_attach_perms") == "true") 3908 if (World.GetExtraSetting("auto_grant_attach_perms") == "true")
3560 implicitPerms = ScriptBaseClass.PERMISSION_ATTACH; 3909 implicitPerms = ScriptBaseClass.PERMISSION_ATTACH;
3561 } 3910 }
3911 if (World.GetExtraSetting("auto_grant_all_perms") == "true")
3912 {
3913 implicitPerms = perm;
3914 }
3562 } 3915 }
3563 3916
3564 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3917 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3565 { 3918 {
3566 lock (m_host.TaskInventory) 3919 m_host.TaskInventory.LockItemsForWrite(true);
3567 { 3920 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3568 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; 3921 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3569 m_host.TaskInventory[m_item.ItemID].PermsMask = perm; 3922 m_host.TaskInventory.LockItemsForWrite(false);
3570 }
3571 3923
3572 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( 3924 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3573 "run_time_permissions", new Object[] { 3925 "run_time_permissions", new Object[] {
@@ -3610,11 +3962,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3610 3962
3611 if (!m_waitingForScriptAnswer) 3963 if (!m_waitingForScriptAnswer)
3612 { 3964 {
3613 lock (m_host.TaskInventory) 3965 m_host.TaskInventory.LockItemsForWrite(true);
3614 { 3966 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3615 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; 3967 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3616 m_host.TaskInventory[m_item.ItemID].PermsMask = 0; 3968 m_host.TaskInventory.LockItemsForWrite(false);
3617 }
3618 3969
3619 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3970 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
3620 m_waitingForScriptAnswer=true; 3971 m_waitingForScriptAnswer=true;
@@ -3643,14 +3994,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3643 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3994 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3644 llReleaseControls(); 3995 llReleaseControls();
3645 3996
3646 lock (m_host.TaskInventory) 3997 m_host.TaskInventory.LockItemsForWrite(true);
3647 { 3998 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
3648 m_host.TaskInventory[m_item.ItemID].PermsMask = answer; 3999 m_host.TaskInventory.LockItemsForWrite(false);
3649 } 4000
3650 4001 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3651 m_ScriptEngine.PostScriptEvent( 4002 "run_time_permissions", new Object[] {
3652 m_item.ItemID, 4003 new LSL_Integer(answer) },
3653 new EventParams("run_time_permissions", new Object[] { new LSL_Integer(answer) }, new DetectParams[0])); 4004 new DetectParams[0]));
3654 } 4005 }
3655 4006
3656 public LSL_String llGetPermissionsKey() 4007 public LSL_String llGetPermissionsKey()
@@ -3689,14 +4040,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3689 public void llSetLinkColor(int linknumber, LSL_Vector color, int face) 4040 public void llSetLinkColor(int linknumber, LSL_Vector color, int face)
3690 { 4041 {
3691 List<SceneObjectPart> parts = GetLinkParts(linknumber); 4042 List<SceneObjectPart> parts = GetLinkParts(linknumber);
3692 4043 if (parts.Count > 0)
3693 foreach (SceneObjectPart part in parts) 4044 {
3694 part.SetFaceColorAlpha(face, color, null); 4045 try
4046 {
4047 foreach (SceneObjectPart part in parts)
4048 part.SetFaceColorAlpha(face, color, null);
4049 }
4050 finally
4051 {
4052 }
4053 }
3695 } 4054 }
3696 4055
3697 public void llCreateLink(string target, int parent) 4056 public void llCreateLink(string target, int parent)
3698 { 4057 {
3699 m_host.AddScriptLPS(1); 4058 m_host.AddScriptLPS(1);
4059
3700 UUID targetID; 4060 UUID targetID;
3701 4061
3702 if (!UUID.TryParse(target, out targetID)) 4062 if (!UUID.TryParse(target, out targetID))
@@ -3802,10 +4162,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3802 // Restructuring Multiple Prims. 4162 // Restructuring Multiple Prims.
3803 List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Parts); 4163 List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Parts);
3804 parts.Remove(parentPrim.RootPart); 4164 parts.Remove(parentPrim.RootPart);
3805 foreach (SceneObjectPart part in parts) 4165 if (parts.Count > 0)
3806 { 4166 {
3807 parentPrim.DelinkFromGroup(part.LocalId, true); 4167 try
4168 {
4169 foreach (SceneObjectPart part in parts)
4170 {
4171 parentPrim.DelinkFromGroup(part.LocalId, true);
4172 }
4173 }
4174 finally
4175 {
4176 }
3808 } 4177 }
4178
3809 parentPrim.HasGroupChanged = true; 4179 parentPrim.HasGroupChanged = true;
3810 parentPrim.ScheduleGroupForFullUpdate(); 4180 parentPrim.ScheduleGroupForFullUpdate();
3811 parentPrim.TriggerScriptChangedEvent(Changed.LINK); 4181 parentPrim.TriggerScriptChangedEvent(Changed.LINK);
@@ -3814,12 +4184,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3814 { 4184 {
3815 SceneObjectPart newRoot = parts[0]; 4185 SceneObjectPart newRoot = parts[0];
3816 parts.Remove(newRoot); 4186 parts.Remove(newRoot);
3817 foreach (SceneObjectPart part in parts) 4187
4188 try
3818 { 4189 {
3819 // Required for linking 4190 foreach (SceneObjectPart part in parts)
3820 part.ClearUpdateSchedule(); 4191 {
3821 newRoot.ParentGroup.LinkToGroup(part.ParentGroup); 4192 part.ClearUpdateSchedule();
4193 newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
4194 }
3822 } 4195 }
4196 finally
4197 {
4198 }
4199
4200
3823 newRoot.ParentGroup.HasGroupChanged = true; 4201 newRoot.ParentGroup.HasGroupChanged = true;
3824 newRoot.ParentGroup.ScheduleGroupForFullUpdate(); 4202 newRoot.ParentGroup.ScheduleGroupForFullUpdate();
3825 } 4203 }
@@ -3839,6 +4217,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3839 public void llBreakAllLinks() 4217 public void llBreakAllLinks()
3840 { 4218 {
3841 m_host.AddScriptLPS(1); 4219 m_host.AddScriptLPS(1);
4220
4221 TaskInventoryItem item = m_item;
4222
4223 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4224 && !m_automaticLinkPermission)
4225 {
4226 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4227 return;
4228 }
4229
3842 SceneObjectGroup parentPrim = m_host.ParentGroup; 4230 SceneObjectGroup parentPrim = m_host.ParentGroup;
3843 if (parentPrim.AttachmentPoint != 0) 4231 if (parentPrim.AttachmentPoint != 0)
3844 return; // Fail silently if attached 4232 return; // Fail silently if attached
@@ -3858,13 +4246,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3858 public LSL_String llGetLinkKey(int linknum) 4246 public LSL_String llGetLinkKey(int linknum)
3859 { 4247 {
3860 m_host.AddScriptLPS(1); 4248 m_host.AddScriptLPS(1);
4249 SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum);
4250 if (part != null)
4251 {
4252 return part.UUID.ToString();
4253 }
4254 else
4255 {
4256 if (linknum > m_host.ParentGroup.PrimCount || (linknum == 1 && m_host.ParentGroup.PrimCount == 1))
4257 {
4258 linknum -= (m_host.ParentGroup.PrimCount) + 1;
3861 4259
3862 ISceneEntity entity = GetLinkEntity(linknum); 4260 if (linknum < 0)
4261 return UUID.Zero.ToString();
3863 4262
3864 if (entity != null) 4263 List<ScenePresence> avatars = GetLinkAvatars(ScriptBaseClass.LINK_SET);
3865 return entity.UUID.ToString(); 4264 if (avatars.Count > linknum)
3866 else 4265 {
3867 return ScriptBaseClass.NULL_KEY; 4266 return avatars[linknum].UUID.ToString();
4267 }
4268 }
4269 return UUID.Zero.ToString();
4270 }
3868 } 4271 }
3869 4272
3870 /// <summary> 4273 /// <summary>
@@ -3923,17 +4326,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3923 m_host.AddScriptLPS(1); 4326 m_host.AddScriptLPS(1);
3924 int count = 0; 4327 int count = 0;
3925 4328
3926 lock (m_host.TaskInventory) 4329 m_host.TaskInventory.LockItemsForRead(true);
4330 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3927 { 4331 {
3928 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 4332 if (inv.Value.Type == type || type == -1)
3929 { 4333 {
3930 if (inv.Value.Type == type || type == -1) 4334 count = count + 1;
3931 {
3932 count = count + 1;
3933 }
3934 } 4335 }
3935 } 4336 }
3936 4337
4338 m_host.TaskInventory.LockItemsForRead(false);
3937 return count; 4339 return count;
3938 } 4340 }
3939 4341
@@ -3942,16 +4344,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3942 m_host.AddScriptLPS(1); 4344 m_host.AddScriptLPS(1);
3943 ArrayList keys = new ArrayList(); 4345 ArrayList keys = new ArrayList();
3944 4346
3945 lock (m_host.TaskInventory) 4347 m_host.TaskInventory.LockItemsForRead(true);
4348 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3946 { 4349 {
3947 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 4350 if (inv.Value.Type == type || type == -1)
3948 { 4351 {
3949 if (inv.Value.Type == type || type == -1) 4352 keys.Add(inv.Value.Name);
3950 {
3951 keys.Add(inv.Value.Name);
3952 }
3953 } 4353 }
3954 } 4354 }
4355 m_host.TaskInventory.LockItemsForRead(false);
3955 4356
3956 if (keys.Count == 0) 4357 if (keys.Count == 0)
3957 { 4358 {
@@ -3989,7 +4390,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3989 if (item == null) 4390 if (item == null)
3990 { 4391 {
3991 llSay(0, String.Format("Could not find object '{0}'", inventory)); 4392 llSay(0, String.Format("Could not find object '{0}'", inventory));
3992 throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory)); 4393 return;
4394// throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory));
3993 } 4395 }
3994 4396
3995 UUID objId = item.ItemID; 4397 UUID objId = item.ItemID;
@@ -4017,33 +4419,45 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4017 return; 4419 return;
4018 } 4420 }
4019 } 4421 }
4422
4020 // destination is an avatar 4423 // destination is an avatar
4021 InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, m_host, objId); 4424 InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, m_host, objId);
4022 4425
4023 if (agentItem == null) 4426 if (agentItem == null)
4024 return; 4427 return;
4025 4428
4026 if (m_TransferModule != null) 4429 byte[] bucket = new byte[1];
4027 { 4430 bucket[0] = (byte)item.Type;
4028 byte[] bucket = new byte[1]; 4431 //byte[] objBytes = agentItem.ID.GetBytes();
4029 bucket[0] = (byte)item.Type; 4432 //Array.Copy(objBytes, 0, bucket, 1, 16);
4030 4433
4031 GridInstantMessage msg = new GridInstantMessage(World, 4434 GridInstantMessage msg = new GridInstantMessage(World,
4032 m_host.OwnerID, m_host.Name, destId, 4435 m_host.OwnerID, m_host.Name, destId,
4033 (byte)InstantMessageDialog.TaskInventoryOffered, 4436 (byte)InstantMessageDialog.TaskInventoryOffered,
4034 false, item.Name+". "+m_host.Name+" is located at "+ 4437 false, item.Name+". "+m_host.Name+" is located at "+
4035 World.RegionInfo.RegionName+" "+ 4438 World.RegionInfo.RegionName+" "+
4036 m_host.AbsolutePosition.ToString(), 4439 m_host.AbsolutePosition.ToString(),
4037 agentItem.ID, true, m_host.AbsolutePosition, 4440 agentItem.ID, true, m_host.AbsolutePosition,
4038 bucket, true); 4441 bucket, true);
4039 4442
4040 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); 4443 ScenePresence sp;
4041 }
4042 4444
4445 if (World.TryGetScenePresence(destId, out sp))
4446 {
4447 sp.ControllingClient.SendInstantMessage(msg);
4448 }
4449 else
4450 {
4451 if (m_TransferModule != null)
4452 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {});
4453 }
4454
4455 //This delay should only occur when giving inventory to avatars.
4043 ScriptSleep(3000); 4456 ScriptSleep(3000);
4044 } 4457 }
4045 } 4458 }
4046 4459
4460 [DebuggerNonUserCode]
4047 public void llRemoveInventory(string name) 4461 public void llRemoveInventory(string name)
4048 { 4462 {
4049 m_host.AddScriptLPS(1); 4463 m_host.AddScriptLPS(1);
@@ -4098,109 +4512,115 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4098 { 4512 {
4099 m_host.AddScriptLPS(1); 4513 m_host.AddScriptLPS(1);
4100 4514
4101 UUID uuid = (UUID)id; 4515 UUID uuid;
4102 PresenceInfo pinfo = null; 4516 if (UUID.TryParse(id, out uuid))
4103 UserAccount account;
4104
4105 UserInfoCacheEntry ce;
4106 if (!m_userInfoCache.TryGetValue(uuid, out ce))
4107 { 4517 {
4108 account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid); 4518 PresenceInfo pinfo = null;
4109 if (account == null) 4519 UserAccount account;
4520
4521 UserInfoCacheEntry ce;
4522 if (!m_userInfoCache.TryGetValue(uuid, out ce))
4110 { 4523 {
4111 m_userInfoCache[uuid] = null; // Cache negative 4524 account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, uuid);
4112 return UUID.Zero.ToString(); 4525 if (account == null)
4113 } 4526 {
4527 m_userInfoCache[uuid] = null; // Cache negative
4528 return UUID.Zero.ToString();
4529 }
4114 4530
4115 4531
4116 PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() }); 4532 PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() });
4117 if (pinfos != null && pinfos.Length > 0) 4533 if (pinfos != null && pinfos.Length > 0)
4118 {
4119 foreach (PresenceInfo p in pinfos)
4120 { 4534 {
4121 if (p.RegionID != UUID.Zero) 4535 foreach (PresenceInfo p in pinfos)
4122 { 4536 {
4123 pinfo = p; 4537 if (p.RegionID != UUID.Zero)
4538 {
4539 pinfo = p;
4540 }
4124 } 4541 }
4125 } 4542 }
4126 }
4127 4543
4128 ce = new UserInfoCacheEntry(); 4544 ce = new UserInfoCacheEntry();
4129 ce.time = Util.EnvironmentTickCount(); 4545 ce.time = Util.EnvironmentTickCount();
4130 ce.account = account; 4546 ce.account = account;
4131 ce.pinfo = pinfo; 4547 ce.pinfo = pinfo;
4132 } 4548 m_userInfoCache[uuid] = ce;
4133 else 4549 }
4134 { 4550 else
4135 if (ce == null) 4551 {
4136 return UUID.Zero.ToString(); 4552 if (ce == null)
4553 return UUID.Zero.ToString();
4137 4554
4138 account = ce.account; 4555 account = ce.account;
4139 pinfo = ce.pinfo; 4556 pinfo = ce.pinfo;
4140 } 4557 }
4141 4558
4142 if (Util.EnvironmentTickCount() < ce.time || (Util.EnvironmentTickCount() - ce.time) >= 20000) 4559 if (Util.EnvironmentTickCount() < ce.time || (Util.EnvironmentTickCount() - ce.time) >= 20000)
4143 {
4144 PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() });
4145 if (pinfos != null && pinfos.Length > 0)
4146 { 4560 {
4147 foreach (PresenceInfo p in pinfos) 4561 PresenceInfo[] pinfos = World.PresenceService.GetAgents(new string[] { uuid.ToString() });
4562 if (pinfos != null && pinfos.Length > 0)
4148 { 4563 {
4149 if (p.RegionID != UUID.Zero) 4564 foreach (PresenceInfo p in pinfos)
4150 { 4565 {
4151 pinfo = p; 4566 if (p.RegionID != UUID.Zero)
4567 {
4568 pinfo = p;
4569 }
4152 } 4570 }
4153 } 4571 }
4154 } 4572 else
4155 else 4573 pinfo = null;
4156 pinfo = null;
4157 4574
4158 ce.time = Util.EnvironmentTickCount(); 4575 ce.time = Util.EnvironmentTickCount();
4159 ce.pinfo = pinfo; 4576 ce.pinfo = pinfo;
4160 } 4577 }
4161 4578
4162 string reply = String.Empty; 4579 string reply = String.Empty;
4163 4580
4164 switch (data) 4581 switch (data)
4165 { 4582 {
4166 case 1: // DATA_ONLINE (0|1) 4583 case 1: // DATA_ONLINE (0|1)
4167 if (pinfo != null && pinfo.RegionID != UUID.Zero) 4584 if (pinfo != null && pinfo.RegionID != UUID.Zero)
4168 reply = "1"; 4585 reply = "1";
4169 else 4586 else
4170 reply = "0"; 4587 reply = "0";
4171 break; 4588 break;
4172 case 2: // DATA_NAME (First Last) 4589 case 2: // DATA_NAME (First Last)
4173 reply = account.FirstName + " " + account.LastName; 4590 reply = account.FirstName + " " + account.LastName;
4174 break; 4591 break;
4175 case 3: // DATA_BORN (YYYY-MM-DD) 4592 case 3: // DATA_BORN (YYYY-MM-DD)
4176 DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0); 4593 DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0);
4177 born = born.AddSeconds(account.Created); 4594 born = born.AddSeconds(account.Created);
4178 reply = born.ToString("yyyy-MM-dd"); 4595 reply = born.ToString("yyyy-MM-dd");
4179 break; 4596 break;
4180 case 4: // DATA_RATING (0,0,0,0,0,0) 4597 case 4: // DATA_RATING (0,0,0,0,0,0)
4181 reply = "0,0,0,0,0,0"; 4598 reply = "0,0,0,0,0,0";
4182 break; 4599 break;
4183 case 7: // DATA_USERLEVEL (integer) 4600 case 8: // DATA_PAYINFO (0|1|2|3)
4184 reply = account.UserLevel.ToString(); 4601 reply = "0";
4185 break; 4602 break;
4186 case 8: // DATA_PAYINFO (0|1|2|3) 4603 default:
4187 reply = "0"; 4604 return UUID.Zero.ToString(); // Raise no event
4188 break; 4605 }
4189 default:
4190 return UUID.Zero.ToString(); // Raise no event
4191 }
4192 4606
4193 UUID rq = UUID.Random(); 4607 UUID rq = UUID.Random();
4194 4608
4195 UUID tid = AsyncCommands. 4609 UUID tid = AsyncCommands.
4196 DataserverPlugin.RegisterRequest(m_host.LocalId, 4610 DataserverPlugin.RegisterRequest(m_host.LocalId,
4197 m_item.ItemID, rq.ToString()); 4611 m_item.ItemID, rq.ToString());
4198 4612
4199 AsyncCommands. 4613 AsyncCommands.
4200 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4614 DataserverPlugin.DataserverReply(rq.ToString(), reply);
4201 4615
4202 ScriptSleep(100); 4616 ScriptSleep(100);
4203 return tid.ToString(); 4617 return tid.ToString();
4618 }
4619 else
4620 {
4621 ShoutError("Invalid UUID passed to llRequestAgentData.");
4622 }
4623 return "";
4204 } 4624 }
4205 4625
4206 public LSL_String llRequestInventoryData(string name) 4626 public LSL_String llRequestInventoryData(string name)
@@ -4257,12 +4677,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4257 if (UUID.TryParse(agent, out agentId)) 4677 if (UUID.TryParse(agent, out agentId))
4258 { 4678 {
4259 ScenePresence presence = World.GetScenePresence(agentId); 4679 ScenePresence presence = World.GetScenePresence(agentId);
4260 if (presence != null) 4680 if (presence != null && presence.PresenceType != PresenceType.Npc)
4261 { 4681 {
4682 // agent must not be a god
4683 if (presence.UserLevel >= 200) return;
4684
4262 // agent must be over the owners land 4685 // agent must be over the owners land
4263 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID) 4686 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
4264 { 4687 {
4265 World.TeleportClientHome(agentId, presence.ControllingClient); 4688 if (!World.TeleportClientHome(agentId, presence.ControllingClient))
4689 {
4690 // They can't be teleported home for some reason
4691 GridRegion regionInfo = World.GridService.GetRegionByUUID(UUID.Zero, new UUID("2b02daac-e298-42fa-9a75-f488d37896e6"));
4692 if (regionInfo != null)
4693 {
4694 World.RequestTeleportLocation(
4695 presence.ControllingClient, regionInfo.RegionHandle, new Vector3(128, 128, 23), Vector3.Zero,
4696 (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome));
4697 }
4698 }
4266 } 4699 }
4267 } 4700 }
4268 } 4701 }
@@ -4280,20 +4713,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4280 ScenePresence presence = World.GetScenePresence(agentId); 4713 ScenePresence presence = World.GetScenePresence(agentId);
4281 if (presence != null && presence.PresenceType != PresenceType.Npc) 4714 if (presence != null && presence.PresenceType != PresenceType.Npc)
4282 { 4715 {
4283 // agent must not be a god
4284 if (presence.GodLevel >= 200) return;
4285
4286 if (destination == String.Empty) 4716 if (destination == String.Empty)
4287 destination = World.RegionInfo.RegionName; 4717 destination = World.RegionInfo.RegionName;
4288 4718
4289 // agent must be over the owners land 4719 if (m_item.PermsGranter == agentId)
4290 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID) 4720 {
4721 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
4722 {
4723 DoLLTeleport(presence, destination, targetPos, targetLookAt);
4724 }
4725 }
4726
4727 // agent must be wearing the object
4728 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID)
4291 { 4729 {
4292 DoLLTeleport(presence, destination, targetPos, targetLookAt); 4730 DoLLTeleport(presence, destination, targetPos, targetLookAt);
4293 } 4731 }
4294 else // or must be wearing the prim 4732 else
4295 { 4733 {
4296 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) 4734 // agent must not be a god
4735 if (presence.GodLevel >= 200) return;
4736
4737 // agent must be over the owners land
4738 ILandObject agentLand = World.LandChannel.GetLandObject(presence.AbsolutePosition);
4739 ILandObject objectLand = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
4740 if (m_host.OwnerID == objectLand.LandData.OwnerID && m_host.OwnerID == agentLand.LandData.OwnerID)
4297 { 4741 {
4298 DoLLTeleport(presence, destination, targetPos, targetLookAt); 4742 DoLLTeleport(presence, destination, targetPos, targetLookAt);
4299 } 4743 }
@@ -4307,24 +4751,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4307 m_host.AddScriptLPS(1); 4751 m_host.AddScriptLPS(1);
4308 UUID agentId = new UUID(); 4752 UUID agentId = new UUID();
4309 4753
4310 ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y); 4754 ulong regionHandle = Utils.UIntsToLong((uint)(global_coords.x / 256) * 256, (uint)(global_coords.y / 256) * 256);
4311 4755
4312 if (UUID.TryParse(agent, out agentId)) 4756 if (UUID.TryParse(agent, out agentId))
4313 { 4757 {
4758 // This function is owner only!
4759 if (m_host.OwnerID != agentId)
4760 return;
4761
4314 ScenePresence presence = World.GetScenePresence(agentId); 4762 ScenePresence presence = World.GetScenePresence(agentId);
4763
4764 // Can't TP sitting avatars
4765 if (presence.ParentID != 0) // Sitting
4766 return;
4767
4315 if (presence != null && presence.PresenceType != PresenceType.Npc) 4768 if (presence != null && presence.PresenceType != PresenceType.Npc)
4316 { 4769 {
4317 // agent must not be a god 4770 if (m_item.PermsGranter == agentId)
4318 if (presence.GodLevel >= 200) return;
4319
4320 // agent must be over the owners land
4321 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
4322 {
4323 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4324 }
4325 else // or must be wearing the prim
4326 { 4771 {
4327 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.OwnerID == presence.UUID) 4772 // If attached using llAttachToAvatarTemp, cowardly refuse
4773 if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero)
4774 return;
4775
4776 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
4328 { 4777 {
4329 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); 4778 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4330 } 4779 }
@@ -4368,7 +4817,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4368 UUID av = new UUID(); 4817 UUID av = new UUID();
4369 if (!UUID.TryParse(agent,out av)) 4818 if (!UUID.TryParse(agent,out av))
4370 { 4819 {
4371 LSLError("First parameter to llDialog needs to be a key");
4372 return; 4820 return;
4373 } 4821 }
4374 4822
@@ -4401,9 +4849,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4401 { 4849 {
4402 m_host.AddScriptLPS(1); 4850 m_host.AddScriptLPS(1);
4403 4851
4852 if(impact_sound == "")
4853 {
4854 m_host.CollisionSoundVolume = (float)impact_volume;
4855 m_host.CollisionSound = m_host.invalidCollisionSoundUUID;
4856 m_host.CollisionSoundType = 0;
4857 return;
4858 }
4404 // TODO: Parameter check logic required. 4859 // TODO: Parameter check logic required.
4405 m_host.CollisionSound = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound); 4860 m_host.CollisionSound = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound);
4406 m_host.CollisionSoundVolume = (float)impact_volume; 4861 m_host.CollisionSoundVolume = (float)impact_volume;
4862 m_host.CollisionSoundType = 1;
4407 } 4863 }
4408 4864
4409 public LSL_String llGetAnimation(string id) 4865 public LSL_String llGetAnimation(string id)
@@ -4417,14 +4873,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4417 4873
4418 if (m_host.RegionHandle == presence.RegionHandle) 4874 if (m_host.RegionHandle == presence.RegionHandle)
4419 { 4875 {
4420 Dictionary<UUID, string> animationstateNames = DefaultAvatarAnimations.AnimStateNames;
4421
4422 if (presence != null) 4876 if (presence != null)
4423 { 4877 {
4424 AnimationSet currentAnims = presence.Animator.Animations; 4878 if (presence.SitGround)
4425 string currentAnimationState = String.Empty; 4879 return "Sitting on Ground";
4426 if (animationstateNames.TryGetValue(currentAnims.ImplicitDefaultAnimation.AnimID, out currentAnimationState)) 4880 if (presence.ParentID != 0 || presence.ParentUUID != UUID.Zero)
4427 return currentAnimationState; 4881 return "Sitting";
4882
4883 string movementAnimation = presence.Animator.CurrentMovementAnimation;
4884 string lslMovementAnimation;
4885
4886 if (MovementAnimationsForLSL.TryGetValue(movementAnimation, out lslMovementAnimation))
4887 return lslMovementAnimation;
4428 } 4888 }
4429 } 4889 }
4430 4890
@@ -4572,7 +5032,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4572 { 5032 {
4573 float distance = (PusheePos - m_host.AbsolutePosition).Length(); 5033 float distance = (PusheePos - m_host.AbsolutePosition).Length();
4574 float distance_term = distance * distance * distance; // Script Energy 5034 float distance_term = distance * distance * distance; // Script Energy
4575 float pusher_mass = m_host.GetMass(); 5035 // use total object mass and not part
5036 float pusher_mass = m_host.ParentGroup.GetMass();
4576 5037
4577 float PUSH_ATTENUATION_DISTANCE = 17f; 5038 float PUSH_ATTENUATION_DISTANCE = 17f;
4578 float PUSH_ATTENUATION_SCALE = 5f; 5039 float PUSH_ATTENUATION_SCALE = 5f;
@@ -4809,6 +5270,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4809 { 5270 {
4810 return item.AssetID.ToString(); 5271 return item.AssetID.ToString();
4811 } 5272 }
5273 m_host.TaskInventory.LockItemsForRead(false);
4812 5274
4813 return UUID.Zero.ToString(); 5275 return UUID.Zero.ToString();
4814 } 5276 }
@@ -4961,14 +5423,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4961 { 5423 {
4962 m_host.AddScriptLPS(1); 5424 m_host.AddScriptLPS(1);
4963 5425
4964 if (src == null) 5426 return src.Length;
4965 {
4966 return 0;
4967 }
4968 else
4969 {
4970 return src.Length;
4971 }
4972 } 5427 }
4973 5428
4974 public LSL_Integer llList2Integer(LSL_List src, int index) 5429 public LSL_Integer llList2Integer(LSL_List src, int index)
@@ -5039,7 +5494,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5039 else if (src.Data[index] is LSL_Float) 5494 else if (src.Data[index] is LSL_Float)
5040 return Convert.ToDouble(((LSL_Float)src.Data[index]).value); 5495 return Convert.ToDouble(((LSL_Float)src.Data[index]).value);
5041 else if (src.Data[index] is LSL_String) 5496 else if (src.Data[index] is LSL_String)
5042 return Convert.ToDouble(((LSL_String)src.Data[index]).m_string); 5497 {
5498 string str = ((LSL_String) src.Data[index]).m_string;
5499 Match m = Regex.Match(str, "^\\s*(-?\\+?[,0-9]+\\.?[0-9]*)");
5500 if (m != Match.Empty)
5501 {
5502 str = m.Value;
5503 double d = 0.0;
5504 if (!Double.TryParse(str, out d))
5505 return 0.0;
5506
5507 return d;
5508 }
5509 return 0.0;
5510 }
5043 return Convert.ToDouble(src.Data[index]); 5511 return Convert.ToDouble(src.Data[index]);
5044 } 5512 }
5045 catch (FormatException) 5513 catch (FormatException)
@@ -5081,7 +5549,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5081 // for completion and should LSL_Key ever be implemented 5549 // for completion and should LSL_Key ever be implemented
5082 // as it's own struct 5550 // as it's own struct
5083 else if (!(src.Data[index] is LSL_String || 5551 else if (!(src.Data[index] is LSL_String ||
5084 src.Data[index] is LSL_Key)) 5552 src.Data[index] is LSL_Key ||
5553 src.Data[index] is String))
5085 { 5554 {
5086 return ""; 5555 return "";
5087 } 5556 }
@@ -5339,7 +5808,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5339 } 5808 }
5340 } 5809 }
5341 } 5810 }
5342 else { 5811 else
5812 {
5343 object[] array = new object[src.Length]; 5813 object[] array = new object[src.Length];
5344 Array.Copy(src.Data, 0, array, 0, src.Length); 5814 Array.Copy(src.Data, 0, array, 0, src.Length);
5345 result = new LSL_List(array); 5815 result = new LSL_List(array);
@@ -5446,7 +5916,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5446 public LSL_Integer llGetRegionAgentCount() 5916 public LSL_Integer llGetRegionAgentCount()
5447 { 5917 {
5448 m_host.AddScriptLPS(1); 5918 m_host.AddScriptLPS(1);
5449 return new LSL_Integer(World.GetRootAgentCount()); 5919
5920 int count = 0;
5921 World.ForEachRootScenePresence(delegate(ScenePresence sp) {
5922 count++;
5923 });
5924
5925 return new LSL_Integer(count);
5450 } 5926 }
5451 5927
5452 public LSL_Vector llGetRegionCorner() 5928 public LSL_Vector llGetRegionCorner()
@@ -5687,6 +6163,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5687 flags |= ScriptBaseClass.AGENT_AWAY; 6163 flags |= ScriptBaseClass.AGENT_AWAY;
5688 } 6164 }
5689 6165
6166 UUID busy = new UUID("efcf670c-2d18-8128-973a-034ebc806b67");
6167 UUID[] anims = agent.Animator.GetAnimationArray();
6168 if (Array.Exists<UUID>(anims, a => { return a == busy; }))
6169 {
6170 flags |= ScriptBaseClass.AGENT_BUSY;
6171 }
6172
5690 // seems to get unset, even if in mouselook, when avatar is sitting on a prim??? 6173 // seems to get unset, even if in mouselook, when avatar is sitting on a prim???
5691 if ((agent.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) 6174 if ((agent.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
5692 { 6175 {
@@ -5734,6 +6217,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5734 flags |= ScriptBaseClass.AGENT_SITTING; 6217 flags |= ScriptBaseClass.AGENT_SITTING;
5735 } 6218 }
5736 6219
6220 if (agent.Appearance.VisualParams[(int)AvatarAppearance.VPElement.SHAPE_MALE] > 0)
6221 {
6222 flags |= ScriptBaseClass.AGENT_MALE;
6223 }
6224
5737 return flags; 6225 return flags;
5738 } 6226 }
5739 6227
@@ -5879,9 +6367,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5879 6367
5880 List<SceneObjectPart> parts = GetLinkParts(linknumber); 6368 List<SceneObjectPart> parts = GetLinkParts(linknumber);
5881 6369
5882 foreach (SceneObjectPart part in parts) 6370 try
6371 {
6372 foreach (SceneObjectPart part in parts)
6373 {
6374 SetTextureAnim(part, mode, face, sizex, sizey, start, length, rate);
6375 }
6376 }
6377 finally
5883 { 6378 {
5884 SetTextureAnim(part, mode, face, sizex, sizey, start, length, rate);
5885 } 6379 }
5886 } 6380 }
5887 6381
@@ -5935,13 +6429,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5935 6429
5936 if (m_host.OwnerID == land.LandData.OwnerID) 6430 if (m_host.OwnerID == land.LandData.OwnerID)
5937 { 6431 {
5938 World.TeleportClientHome(agentID, presence.ControllingClient); 6432 Vector3 p = World.GetNearestAllowedPosition(presence, land);
6433 presence.TeleportWithMomentum(p, null);
6434 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
5939 } 6435 }
5940 } 6436 }
5941 } 6437 }
5942 ScriptSleep(5000); 6438 ScriptSleep(5000);
5943 } 6439 }
5944 6440
6441 public LSL_List llParseString2List(string str, LSL_List separators, LSL_List in_spacers)
6442 {
6443 return ParseString2List(str, separators, in_spacers, false);
6444 }
6445
5945 public LSL_Integer llOverMyLand(string id) 6446 public LSL_Integer llOverMyLand(string id)
5946 { 6447 {
5947 m_host.AddScriptLPS(1); 6448 m_host.AddScriptLPS(1);
@@ -5994,26 +6495,55 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5994 } 6495 }
5995 else 6496 else
5996 { 6497 {
5997 agentSize = GetAgentSize(avatar); 6498// agentSize = new LSL_Vector(0.45f, 0.6f, avatar.Appearance.AvatarHeight);
6499 Vector3 s = avatar.Appearance.AvatarSize;
6500 agentSize = new LSL_Vector(s.X, s.Y, s.Z);
5998 } 6501 }
5999
6000 return agentSize; 6502 return agentSize;
6001 } 6503 }
6002 6504
6003 public LSL_Integer llSameGroup(string agent) 6505 public LSL_Integer llSameGroup(string id)
6004 { 6506 {
6005 m_host.AddScriptLPS(1); 6507 m_host.AddScriptLPS(1);
6006 UUID agentId = new UUID(); 6508 UUID uuid = new UUID();
6007 if (!UUID.TryParse(agent, out agentId)) 6509 if (!UUID.TryParse(id, out uuid))
6008 return new LSL_Integer(0);
6009 ScenePresence presence = World.GetScenePresence(agentId);
6010 if (presence == null || presence.IsChildAgent) // Return flase for child agents
6011 return new LSL_Integer(0); 6510 return new LSL_Integer(0);
6012 IClientAPI client = presence.ControllingClient; 6511
6013 if (m_host.GroupID == client.ActiveGroupId) 6512 // Check if it's a group key
6513 if (uuid == m_host.ParentGroup.RootPart.GroupID)
6014 return new LSL_Integer(1); 6514 return new LSL_Integer(1);
6015 else 6515
6516 // We got passed a UUID.Zero
6517 if (uuid == UUID.Zero)
6518 return new LSL_Integer(0);
6519
6520 // Handle the case where id names an avatar
6521 ScenePresence presence = World.GetScenePresence(uuid);
6522 if (presence != null)
6523 {
6524 if (presence.IsChildAgent)
6525 return new LSL_Integer(0);
6526
6527 IClientAPI client = presence.ControllingClient;
6528 if (m_host.ParentGroup.RootPart.GroupID == client.ActiveGroupId)
6529 return new LSL_Integer(1);
6530
6016 return new LSL_Integer(0); 6531 return new LSL_Integer(0);
6532 }
6533
6534 // Handle object case
6535 SceneObjectPart part = World.GetSceneObjectPart(uuid);
6536 if (part != null)
6537 {
6538 // This will handle both deed and non-deed and also the no
6539 // group case
6540 if (part.ParentGroup.RootPart.GroupID == m_host.ParentGroup.RootPart.GroupID)
6541 return new LSL_Integer(1);
6542
6543 return new LSL_Integer(0);
6544 }
6545
6546 return new LSL_Integer(0);
6017 } 6547 }
6018 6548
6019 public void llUnSit(string id) 6549 public void llUnSit(string id)
@@ -6572,6 +7102,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6572 7102
6573 protected void SitTarget(SceneObjectPart part, LSL_Vector offset, LSL_Rotation rot) 7103 protected void SitTarget(SceneObjectPart part, LSL_Vector offset, LSL_Rotation rot)
6574 { 7104 {
7105 // LSL quaternions can normalize to 0, normal Quaternions can't.
7106 if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0)
7107 rot.s = 1; // ZERO_ROTATION = 0,0,0,1
7108
6575 part.SitTargetPosition = offset; 7109 part.SitTargetPosition = offset;
6576 part.SitTargetOrientation = rot; 7110 part.SitTargetOrientation = rot;
6577 part.ParentGroup.HasGroupChanged = true; 7111 part.ParentGroup.HasGroupChanged = true;
@@ -6758,30 +7292,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6758 UUID av = new UUID(); 7292 UUID av = new UUID();
6759 if (!UUID.TryParse(avatar,out av)) 7293 if (!UUID.TryParse(avatar,out av))
6760 { 7294 {
6761 LSLError("First parameter to llDialog needs to be a key"); 7295 //LSLError("First parameter to llDialog needs to be a key");
6762 return; 7296 return;
6763 } 7297 }
6764 if (buttons.Length < 1) 7298 if (buttons.Length < 1)
6765 { 7299 {
6766 LSLError("No less than 1 button can be shown"); 7300 buttons.Add("OK");
6767 return;
6768 } 7301 }
6769 if (buttons.Length > 12) 7302 if (buttons.Length > 12)
6770 { 7303 {
6771 LSLError("No more than 12 buttons can be shown"); 7304 ShoutError("button list too long, must be 12 or fewer entries");
6772 return;
6773 } 7305 }
6774 string[] buts = new string[buttons.Length]; 7306 int length = buttons.Length;
6775 for (int i = 0; i < buttons.Length; i++) 7307 if (length > 12)
7308 length = 12;
7309
7310 string[] buts = new string[length];
7311 for (int i = 0; i < length; i++)
6776 { 7312 {
6777 if (buttons.Data[i].ToString() == String.Empty) 7313 if (buttons.Data[i].ToString() == String.Empty)
6778 { 7314 {
6779 LSLError("button label cannot be blank"); 7315 ShoutError("button label cannot be blank");
6780 return; 7316 return;
6781 } 7317 }
6782 if (buttons.Data[i].ToString().Length > 24) 7318 if (buttons.Data[i].ToString().Length > 24)
6783 { 7319 {
6784 LSLError("button label cannot be longer than 24 characters"); 7320 ShoutError("button label cannot be longer than 24 characters");
6785 return; 7321 return;
6786 } 7322 }
6787 buts[i] = buttons.Data[i].ToString(); 7323 buts[i] = buttons.Data[i].ToString();
@@ -6848,9 +7384,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6848 return; 7384 return;
6849 } 7385 }
6850 7386
6851 // the rest of the permission checks are done in RezScript, so check the pin there as well 7387 SceneObjectPart dest = World.GetSceneObjectPart(destId);
6852 World.RezScriptFromPrim(item.ItemID, m_host, destId, pin, running, start_param); 7388 if (dest != null)
7389 {
7390 if ((item.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID)
7391 {
7392 // the rest of the permission checks are done in RezScript, so check the pin there as well
7393 World.RezScriptFromPrim(item.ItemID, m_host, destId, pin, running, start_param);
6853 7394
7395 if ((item.BasePermissions & (uint)PermissionMask.Copy) == 0)
7396 m_host.Inventory.RemoveInventoryItem(item.ItemID);
7397 }
7398 }
6854 // this will cause the delay even if the script pin or permissions were wrong - seems ok 7399 // this will cause the delay even if the script pin or permissions were wrong - seems ok
6855 ScriptSleep(3000); 7400 ScriptSleep(3000);
6856 } 7401 }
@@ -6924,19 +7469,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6924 public LSL_String llMD5String(string src, int nonce) 7469 public LSL_String llMD5String(string src, int nonce)
6925 { 7470 {
6926 m_host.AddScriptLPS(1); 7471 m_host.AddScriptLPS(1);
6927 return Util.Md5Hash(String.Format("{0}:{1}", src, nonce.ToString())); 7472 return Util.Md5Hash(String.Format("{0}:{1}", src, nonce.ToString()), Encoding.UTF8);
6928 } 7473 }
6929 7474
6930 public LSL_String llSHA1String(string src) 7475 public LSL_String llSHA1String(string src)
6931 { 7476 {
6932 m_host.AddScriptLPS(1); 7477 m_host.AddScriptLPS(1);
6933 return Util.SHA1Hash(src).ToLower(); 7478 return Util.SHA1Hash(src, Encoding.UTF8).ToLower();
6934 } 7479 }
6935 7480
6936 protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, byte profileshape, byte pathcurve) 7481 protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, byte profileshape, byte pathcurve)
6937 { 7482 {
6938 float tempFloat; // Use in float expressions below to avoid byte cast precision issues. 7483 float tempFloat; // Use in float expressions below to avoid byte cast precision issues.
6939 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock(); 7484 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock();
7485 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
7486 return shapeBlock;
6940 7487
6941 if (holeshape != (int)ScriptBaseClass.PRIM_HOLE_DEFAULT && 7488 if (holeshape != (int)ScriptBaseClass.PRIM_HOLE_DEFAULT &&
6942 holeshape != (int)ScriptBaseClass.PRIM_HOLE_CIRCLE && 7489 holeshape != (int)ScriptBaseClass.PRIM_HOLE_CIRCLE &&
@@ -7041,6 +7588,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7041 // Prim type box, cylinder and prism. 7588 // Prim type box, cylinder and prism.
7042 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector taper_b, LSL_Vector topshear, byte profileshape, byte pathcurve) 7589 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector taper_b, LSL_Vector topshear, byte profileshape, byte pathcurve)
7043 { 7590 {
7591 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
7592 return;
7593
7044 float tempFloat; // Use in float expressions below to avoid byte cast precision issues. 7594 float tempFloat; // Use in float expressions below to avoid byte cast precision issues.
7045 ObjectShapePacket.ObjectDataBlock shapeBlock; 7595 ObjectShapePacket.ObjectDataBlock shapeBlock;
7046 7596
@@ -7094,6 +7644,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7094 // Prim type sphere. 7644 // Prim type sphere.
7095 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector dimple, byte profileshape, byte pathcurve) 7645 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector dimple, byte profileshape, byte pathcurve)
7096 { 7646 {
7647 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
7648 return;
7649
7097 ObjectShapePacket.ObjectDataBlock shapeBlock; 7650 ObjectShapePacket.ObjectDataBlock shapeBlock;
7098 7651
7099 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist, profileshape, pathcurve); 7652 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist, profileshape, pathcurve);
@@ -7135,6 +7688,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7135 // Prim type torus, tube and ring. 7688 // Prim type torus, tube and ring.
7136 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector holesize, LSL_Vector topshear, LSL_Vector profilecut, LSL_Vector taper_a, float revolutions, float radiusoffset, float skew, byte profileshape, byte pathcurve) 7689 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector holesize, LSL_Vector topshear, LSL_Vector profilecut, LSL_Vector taper_a, float revolutions, float radiusoffset, float skew, byte profileshape, byte pathcurve)
7137 { 7690 {
7691 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
7692 return;
7693
7138 float tempFloat; // Use in float expressions below to avoid byte cast precision issues. 7694 float tempFloat; // Use in float expressions below to avoid byte cast precision issues.
7139 ObjectShapePacket.ObjectDataBlock shapeBlock; 7695 ObjectShapePacket.ObjectDataBlock shapeBlock;
7140 7696
@@ -7270,6 +7826,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7270 // Prim type sculpt. 7826 // Prim type sculpt.
7271 protected void SetPrimitiveShapeParams(SceneObjectPart part, string map, int type, byte pathcurve) 7827 protected void SetPrimitiveShapeParams(SceneObjectPart part, string map, int type, byte pathcurve)
7272 { 7828 {
7829 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
7830 return;
7831
7273 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock(); 7832 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock();
7274 UUID sculptId; 7833 UUID sculptId;
7275 7834
@@ -7292,7 +7851,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7292 type != (ScriptBaseClass.PRIM_SCULPT_TYPE_TORUS | flag)) 7851 type != (ScriptBaseClass.PRIM_SCULPT_TYPE_TORUS | flag))
7293 { 7852 {
7294 // default 7853 // default
7295 type = (int)ScriptBaseClass.PRIM_SCULPT_TYPE_SPHERE; 7854 type = type | (int)ScriptBaseClass.PRIM_SCULPT_TYPE_SPHERE;
7296 } 7855 }
7297 7856
7298 part.Shape.SetSculptProperties((byte)type, sculptId); 7857 part.Shape.SetSculptProperties((byte)type, sculptId);
@@ -7309,15 +7868,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7309 ScriptSleep(200); 7868 ScriptSleep(200);
7310 } 7869 }
7311 7870
7312 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
7313 {
7314 m_host.AddScriptLPS(1);
7315
7316 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParams");
7317
7318 ScriptSleep(200);
7319 }
7320
7321 public void llSetLinkPrimitiveParamsFast(int linknumber, LSL_List rules) 7871 public void llSetLinkPrimitiveParamsFast(int linknumber, LSL_List rules)
7322 { 7872 {
7323 m_host.AddScriptLPS(1); 7873 m_host.AddScriptLPS(1);
@@ -7325,169 +7875,135 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7325 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParamsFast"); 7875 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParamsFast");
7326 } 7876 }
7327 7877
7328 protected void setLinkPrimParams(int linknumber, LSL_List rules, string originFunc) 7878 private void setLinkPrimParams(int linknumber, LSL_List rules, string originFunc)
7329 { 7879 {
7330 List<SceneObjectPart> parts = GetLinkParts(linknumber); 7880 List<object> parts = new List<object>();
7881 List<SceneObjectPart> prims = GetLinkParts(linknumber);
7882 List<ScenePresence> avatars = GetLinkAvatars(linknumber);
7883 foreach (SceneObjectPart p in prims)
7884 parts.Add(p);
7885 foreach (ScenePresence p in avatars)
7886 parts.Add(p);
7331 7887
7332 LSL_List remaining = null; 7888 LSL_List remaining = null;
7333 uint rulesParsed = 0; 7889 uint rulesParsed = 0;
7334 7890
7335 foreach (SceneObjectPart part in parts) 7891 if (parts.Count > 0)
7336 remaining = SetPrimParams(part, rules, originFunc, ref rulesParsed);
7337
7338 while (remaining != null && remaining.Length > 2)
7339 {
7340 linknumber = remaining.GetLSLIntegerItem(0);
7341 rules = remaining.GetSublist(1, -1);
7342 parts = GetLinkParts(linknumber);
7343
7344 foreach (SceneObjectPart part in parts)
7345 remaining = SetPrimParams(part, rules, originFunc, ref rulesParsed);
7346 }
7347 }
7348
7349 public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
7350 {
7351 SceneObjectGroup group = m_host.ParentGroup;
7352
7353 if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
7354 return;
7355 if (group.IsAttachment)
7356 return;
7357
7358 if (frames.Data.Length > 0) // We are getting a new motion
7359 { 7892 {
7360 if (group.RootPart.KeyframeMotion != null) 7893 foreach (object part in parts)
7361 group.RootPart.KeyframeMotion.Delete();
7362 group.RootPart.KeyframeMotion = null;
7363
7364 int idx = 0;
7365
7366 KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
7367 KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
7368
7369 while (idx < options.Data.Length)
7370 { 7894 {
7371 int option = (int)options.GetLSLIntegerItem(idx++); 7895 if (part is SceneObjectPart)
7372 int remain = options.Data.Length - idx; 7896 remaining = SetPrimParams((SceneObjectPart)part, rules, originFunc, ref rulesParsed);
7897 else
7898 remaining = SetPrimParams((ScenePresence)part, rules, originFunc, ref rulesParsed);
7899 }
7373 7900
7374 switch (option) 7901 while ((object)remaining != null && remaining.Length > 2)
7902 {
7903 linknumber = remaining.GetLSLIntegerItem(0);
7904 rules = remaining.GetSublist(1, -1);
7905 parts.Clear();
7906 prims = GetLinkParts(linknumber);
7907 avatars = GetLinkAvatars(linknumber);
7908 foreach (SceneObjectPart p in prims)
7909 parts.Add(p);
7910 foreach (ScenePresence p in avatars)
7911 parts.Add(p);
7912
7913 remaining = null;
7914 foreach (object part in parts)
7375 { 7915 {
7376 case ScriptBaseClass.KFM_MODE: 7916 if (part is SceneObjectPart)
7377 if (remain < 1) 7917 remaining = SetPrimParams((SceneObjectPart)part, rules, originFunc, ref rulesParsed);
7378 break; 7918 else
7379 int modeval = (int)options.GetLSLIntegerItem(idx++); 7919 remaining = SetPrimParams((ScenePresence)part, rules, originFunc, ref rulesParsed);
7380 switch(modeval)
7381 {
7382 case ScriptBaseClass.KFM_FORWARD:
7383 mode = KeyframeMotion.PlayMode.Forward;
7384 break;
7385 case ScriptBaseClass.KFM_REVERSE:
7386 mode = KeyframeMotion.PlayMode.Reverse;
7387 break;
7388 case ScriptBaseClass.KFM_LOOP:
7389 mode = KeyframeMotion.PlayMode.Loop;
7390 break;
7391 case ScriptBaseClass.KFM_PING_PONG:
7392 mode = KeyframeMotion.PlayMode.PingPong;
7393 break;
7394 }
7395 break;
7396 case ScriptBaseClass.KFM_DATA:
7397 if (remain < 1)
7398 break;
7399 int dataval = (int)options.GetLSLIntegerItem(idx++);
7400 data = (KeyframeMotion.DataFormat)dataval;
7401 break;
7402 } 7920 }
7403 } 7921 }
7922 }
7923 }
7404 7924
7405 group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data); 7925 public LSL_List llGetPhysicsMaterial()
7926 {
7927 LSL_List result = new LSL_List();
7406 7928
7407 idx = 0; 7929 result.Add(new LSL_Float(m_host.GravityModifier));
7930 result.Add(new LSL_Float(m_host.Restitution));
7931 result.Add(new LSL_Float(m_host.Friction));
7932 result.Add(new LSL_Float(m_host.Density));
7408 7933
7409 int elemLength = 2; 7934 return result;
7410 if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation)) 7935 }
7411 elemLength = 3;
7412 7936
7413 List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>(); 7937 private void SetPhysicsMaterial(SceneObjectPart part, int material_bits,
7414 while (idx < frames.Data.Length) 7938 float material_density, float material_friction,
7415 { 7939 float material_restitution, float material_gravity_modifier)
7416 int remain = frames.Data.Length - idx; 7940 {
7941 ExtraPhysicsData physdata = new ExtraPhysicsData();
7942 physdata.PhysShapeType = (PhysShapeType)part.PhysicsShapeType;
7943 physdata.Density = part.Density;
7944 physdata.Friction = part.Friction;
7945 physdata.Bounce = part.Restitution;
7946 physdata.GravitationModifier = part.GravityModifier;
7417 7947
7418 if (remain < elemLength) 7948 if ((material_bits & (int)ScriptBaseClass.DENSITY) != 0)
7419 break; 7949 physdata.Density = material_density;
7950 if ((material_bits & (int)ScriptBaseClass.FRICTION) != 0)
7951 physdata.Friction = material_friction;
7952 if ((material_bits & (int)ScriptBaseClass.RESTITUTION) != 0)
7953 physdata.Bounce = material_restitution;
7954 if ((material_bits & (int)ScriptBaseClass.GRAVITY_MULTIPLIER) != 0)
7955 physdata.GravitationModifier = material_gravity_modifier;
7420 7956
7421 KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe(); 7957 part.UpdateExtraPhysics(physdata);
7422 frame.Position = null; 7958 }
7423 frame.Rotation = null;
7424 7959
7425 if ((data & KeyframeMotion.DataFormat.Translation) != 0) 7960 public void llSetPhysicsMaterial(int material_bits,
7426 { 7961 float material_gravity_modifier, float material_restitution,
7427 LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++); 7962 float material_friction, float material_density)
7428 frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z); 7963 {
7429 } 7964 SetPhysicsMaterial(m_host, material_bits, material_density, material_friction, material_restitution, material_gravity_modifier);
7430 if ((data & KeyframeMotion.DataFormat.Rotation) != 0) 7965 }
7431 {
7432 LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
7433 Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
7434 q.Normalize();
7435 frame.Rotation = q;
7436 }
7437 7966
7438 float tempf = (float)frames.GetLSLFloatItem(idx++); 7967 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
7439 frame.TimeMS = (int)(tempf * 1000.0f); 7968 {
7969 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParams");
7970 llSetLinkPrimitiveParamsFast(linknumber, rules);
7971 ScriptSleep(200);
7972 }
7440 7973
7441 keyframes.Add(frame); 7974 // vector up using libomv (c&p from sop )
7442 } 7975 // vector up rotated by r
7976 private Vector3 Zrot(Quaternion r)
7977 {
7978 double x, y, z, m;
7443 7979
7444 group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray()); 7980 m = r.X * r.X + r.Y * r.Y + r.Z * r.Z + r.W * r.W;
7445 group.RootPart.KeyframeMotion.Start(); 7981 if (Math.Abs(1.0 - m) > 0.000001)
7446 }
7447 else
7448 { 7982 {
7449 if (group.RootPart.KeyframeMotion == null) 7983 m = 1.0 / Math.Sqrt(m);
7450 return; 7984 r.X *= (float)m;
7451 7985 r.Y *= (float)m;
7452 if (options.Data.Length == 0) 7986 r.Z *= (float)m;
7453 { 7987 r.W *= (float)m;
7454 group.RootPart.KeyframeMotion.Stop(); 7988 }
7455 return;
7456 }
7457
7458 int idx = 0;
7459 7989
7460 while (idx < options.Data.Length) 7990 x = 2 * (r.X * r.Z + r.Y * r.W);
7461 { 7991 y = 2 * (-r.X * r.W + r.Y * r.Z);
7462 int option = (int)options.GetLSLIntegerItem(idx++); 7992 z = -r.X * r.X - r.Y * r.Y + r.Z * r.Z + r.W * r.W;
7463 7993
7464 switch (option) 7994 return new Vector3((float)x, (float)y, (float)z);
7465 {
7466 case ScriptBaseClass.KFM_COMMAND:
7467 int cmd = (int)options.GetLSLIntegerItem(idx++);
7468 switch (cmd)
7469 {
7470 case ScriptBaseClass.KFM_CMD_PLAY:
7471 group.RootPart.KeyframeMotion.Start();
7472 break;
7473 case ScriptBaseClass.KFM_CMD_STOP:
7474 group.RootPart.KeyframeMotion.Stop();
7475 break;
7476 case ScriptBaseClass.KFM_CMD_PAUSE:
7477 group.RootPart.KeyframeMotion.Pause();
7478 break;
7479 }
7480 break;
7481 }
7482 }
7483 }
7484 } 7995 }
7485 7996
7486 protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed) 7997 protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed)
7487 { 7998 {
7999 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
8000 return null;
8001
7488 int idx = 0; 8002 int idx = 0;
7489 int idxStart = 0; 8003 int idxStart = 0;
7490 8004
8005 SceneObjectGroup parentgrp = part.ParentGroup;
8006
7491 bool positionChanged = false; 8007 bool positionChanged = false;
7492 LSL_Vector currentPosition = GetPartLocalPos(part); 8008 LSL_Vector currentPosition = GetPartLocalPos(part);
7493 8009
@@ -7512,8 +8028,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7512 return null; 8028 return null;
7513 8029
7514 v=rules.GetVector3Item(idx++); 8030 v=rules.GetVector3Item(idx++);
8031 if (part.IsRoot && !part.ParentGroup.IsAttachment)
8032 currentPosition = GetSetPosTarget(part, v, currentPosition, true);
8033 else
8034 currentPosition = GetSetPosTarget(part, v, currentPosition, false);
7515 positionChanged = true; 8035 positionChanged = true;
7516 currentPosition = GetSetPosTarget(part, v, currentPosition);
7517 8036
7518 break; 8037 break;
7519 case (int)ScriptBaseClass.PRIM_SIZE: 8038 case (int)ScriptBaseClass.PRIM_SIZE:
@@ -7530,7 +8049,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7530 8049
7531 LSL_Rotation q = rules.GetQuaternionItem(idx++); 8050 LSL_Rotation q = rules.GetQuaternionItem(idx++);
7532 // try to let this work as in SL... 8051 // try to let this work as in SL...
7533 if (part.ParentID == 0) 8052 if (part.ParentID == 0 || (part.ParentGroup != null && part == part.ParentGroup.RootPart))
7534 { 8053 {
7535 // special case: If we are root, rotate complete SOG to new rotation 8054 // special case: If we are root, rotate complete SOG to new rotation
7536 SetRot(part, q); 8055 SetRot(part, q);
@@ -7824,6 +8343,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7824 8343
7825 break; 8344 break;
7826 8345
8346 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
8347 if (remain < 5)
8348 return null;
8349
8350 int material_bits = rules.GetLSLIntegerItem(idx++);
8351 float material_density = (float)rules.GetLSLFloatItem(idx++);
8352 float material_friction = (float)rules.GetLSLFloatItem(idx++);
8353 float material_restitution = (float)rules.GetLSLFloatItem(idx++);
8354 float material_gravity_modifier = (float)rules.GetLSLFloatItem(idx++);
8355
8356 SetPhysicsMaterial(part, material_bits, material_density, material_friction, material_restitution, material_gravity_modifier);
8357
8358 break;
8359
7827 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: 8360 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
7828 if (remain < 1) 8361 if (remain < 1)
7829 return null; 8362 return null;
@@ -7903,14 +8436,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7903 if (part.ParentGroup.RootPart == part) 8436 if (part.ParentGroup.RootPart == part)
7904 { 8437 {
7905 SceneObjectGroup parent = part.ParentGroup; 8438 SceneObjectGroup parent = part.ParentGroup;
7906 parent.UpdateGroupPosition(currentPosition); 8439 Util.FireAndForget(delegate(object x) {
8440 parent.UpdateGroupPosition(currentPosition);
8441 });
7907 } 8442 }
7908 else 8443 else
7909 { 8444 {
7910 part.OffsetPosition = currentPosition; 8445 part.OffsetPosition = currentPosition;
7911 SceneObjectGroup parent = part.ParentGroup; 8446// SceneObjectGroup parent = part.ParentGroup;
7912 parent.HasGroupChanged = true; 8447// parent.HasGroupChanged = true;
7913 parent.ScheduleGroupForTerseUpdate(); 8448// parent.ScheduleGroupForTerseUpdate();
8449 part.ScheduleTerseUpdate();
7914 } 8450 }
7915 } 8451 }
7916 } 8452 }
@@ -7948,10 +8484,91 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7948 8484
7949 public LSL_String llXorBase64Strings(string str1, string str2) 8485 public LSL_String llXorBase64Strings(string str1, string str2)
7950 { 8486 {
7951 m_host.AddScriptLPS(1); 8487 string b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
7952 Deprecated("llXorBase64Strings"); 8488
7953 ScriptSleep(300); 8489 ScriptSleep(300);
7954 return String.Empty; 8490 m_host.AddScriptLPS(1);
8491
8492 if (str1 == String.Empty)
8493 return String.Empty;
8494 if (str2 == String.Empty)
8495 return str1;
8496
8497 int len = str2.Length;
8498 if ((len % 4) != 0) // LL is EVIL!!!!
8499 {
8500 while (str2.EndsWith("="))
8501 str2 = str2.Substring(0, str2.Length - 1);
8502
8503 len = str2.Length;
8504 int mod = len % 4;
8505
8506 if (mod == 1)
8507 str2 = str2.Substring(0, str2.Length - 1);
8508 else if (mod == 2)
8509 str2 += "==";
8510 else if (mod == 3)
8511 str2 += "=";
8512 }
8513
8514 byte[] data1;
8515 byte[] data2;
8516 try
8517 {
8518 data1 = Convert.FromBase64String(str1);
8519 data2 = Convert.FromBase64String(str2);
8520 }
8521 catch (Exception)
8522 {
8523 return new LSL_String(String.Empty);
8524 }
8525
8526 // For cases where the decoded length of s2 is greater
8527 // than the decoded length of s1, simply perform a normal
8528 // decode and XOR
8529 //
8530 if (data2.Length >= data1.Length)
8531 {
8532 for (int pos = 0 ; pos < data1.Length ; pos++ )
8533 data1[pos] ^= data2[pos];
8534
8535 return Convert.ToBase64String(data1);
8536 }
8537
8538 // Remove padding
8539 while (str1.EndsWith("="))
8540 str1 = str1.Substring(0, str1.Length - 1);
8541 while (str2.EndsWith("="))
8542 str2 = str2.Substring(0, str2.Length - 1);
8543
8544 byte[] d1 = new byte[str1.Length];
8545 byte[] d2 = new byte[str2.Length];
8546
8547 for (int i = 0 ; i < str1.Length ; i++)
8548 {
8549 int idx = b64.IndexOf(str1.Substring(i, 1));
8550 if (idx == -1)
8551 idx = 0;
8552 d1[i] = (byte)idx;
8553 }
8554
8555 for (int i = 0 ; i < str2.Length ; i++)
8556 {
8557 int idx = b64.IndexOf(str2.Substring(i, 1));
8558 if (idx == -1)
8559 idx = 0;
8560 d2[i] = (byte)idx;
8561 }
8562
8563 string output = String.Empty;
8564
8565 for (int pos = 0 ; pos < d1.Length ; pos++)
8566 output += b64[d1[pos] ^ d2[pos % d2.Length]];
8567
8568 while (output.Length % 3 > 0)
8569 output += "=";
8570
8571 return output;
7955 } 8572 }
7956 8573
7957 public void llRemoteDataSetRegion() 8574 public void llRemoteDataSetRegion()
@@ -8076,8 +8693,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8076 public LSL_Integer llGetNumberOfPrims() 8693 public LSL_Integer llGetNumberOfPrims()
8077 { 8694 {
8078 m_host.AddScriptLPS(1); 8695 m_host.AddScriptLPS(1);
8079 8696 int avatarCount = m_host.ParentGroup.GetLinkedAvatars().Count;
8080 return m_host.ParentGroup.PrimCount + m_host.ParentGroup.GetSittingAvatarsCount(); 8697
8698 return m_host.ParentGroup.PrimCount + avatarCount;
8081 } 8699 }
8082 8700
8083 /// <summary> 8701 /// <summary>
@@ -8092,55 +8710,114 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8092 m_host.AddScriptLPS(1); 8710 m_host.AddScriptLPS(1);
8093 UUID objID = UUID.Zero; 8711 UUID objID = UUID.Zero;
8094 LSL_List result = new LSL_List(); 8712 LSL_List result = new LSL_List();
8713
8714 // If the ID is not valid, return null result
8095 if (!UUID.TryParse(obj, out objID)) 8715 if (!UUID.TryParse(obj, out objID))
8096 { 8716 {
8097 result.Add(new LSL_Vector()); 8717 result.Add(new LSL_Vector());
8098 result.Add(new LSL_Vector()); 8718 result.Add(new LSL_Vector());
8099 return result; 8719 return result;
8100 } 8720 }
8721
8722 // Check if this is an attached prim. If so, replace
8723 // the UUID with the avatar UUID and report it's bounding box
8724 SceneObjectPart part = World.GetSceneObjectPart(objID);
8725 if (part != null && part.ParentGroup.IsAttachment)
8726 objID = part.ParentGroup.AttachedAvatar;
8727
8728 // Find out if this is an avatar ID. If so, return it's box
8101 ScenePresence presence = World.GetScenePresence(objID); 8729 ScenePresence presence = World.GetScenePresence(objID);
8102 if (presence != null) 8730 if (presence != null)
8103 { 8731 {
8104 if (presence.ParentID == 0) // not sat on an object 8732 // As per LSL Wiki, there is no difference between sitting
8733 // and standing avatar since server 1.36
8734 LSL_Vector lower;
8735 LSL_Vector upper;
8736
8737 Vector3 box = presence.Appearance.AvatarBoxSize * 0.5f;
8738
8739 if (presence.Animator.Animations.ImplicitDefaultAnimation.AnimID
8740 == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
8741/*
8105 { 8742 {
8106 LSL_Vector lower; 8743 // This is for ground sitting avatars
8107 LSL_Vector upper; 8744 float height = presence.Appearance.AvatarHeight / 2.66666667f;
8108 if (presence.Animator.Animations.ImplicitDefaultAnimation.AnimID 8745 lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
8109 == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) 8746 upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
8110 {
8111 // This is for ground sitting avatars
8112 float height = presence.Appearance.AvatarHeight / 2.66666667f;
8113 lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
8114 upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
8115 }
8116 else
8117 {
8118 // This is for standing/flying avatars
8119 float height = presence.Appearance.AvatarHeight / 2.0f;
8120 lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
8121 upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
8122 }
8123 result.Add(lower);
8124 result.Add(upper);
8125 return result;
8126 } 8747 }
8127 else 8748 else
8128 { 8749 {
8129 // sitting on an object so we need the bounding box of that 8750 // This is for standing/flying avatars
8130 // which should include the avatar so set the UUID to the 8751 float height = presence.Appearance.AvatarHeight / 2.0f;
8131 // UUID of the object the avatar is sat on and allow it to fall through 8752 lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
8132 // to processing an object 8753 upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
8133 SceneObjectPart p = World.GetSceneObjectPart(presence.ParentID);
8134 objID = p.UUID;
8135 } 8754 }
8755
8756 // Adjust to the documented error offsets (see LSL Wiki)
8757 lower += new LSL_Vector(0.05f, 0.05f, 0.05f);
8758 upper -= new LSL_Vector(0.05f, 0.05f, 0.05f);
8759*/
8760 {
8761 // This is for ground sitting avatars TODO!
8762 lower = new LSL_Vector(-box.X - 0.1125, -box.Y, box.Z * -1.0f);
8763 upper = new LSL_Vector(box.X + 0.1125, box.Y, box.Z * -1.0f);
8764 }
8765 else
8766 {
8767 // This is for standing/flying avatars
8768 lower = new LSL_Vector(-box.X, -box.Y, -box.Z);
8769 upper = new LSL_Vector(box.X, box.Y, box.Z);
8770 }
8771
8772 if (lower.x > upper.x)
8773 lower.x = upper.x;
8774 if (lower.y > upper.y)
8775 lower.y = upper.y;
8776 if (lower.z > upper.z)
8777 lower.z = upper.z;
8778
8779 result.Add(lower);
8780 result.Add(upper);
8781 return result;
8136 } 8782 }
8137 SceneObjectPart part = World.GetSceneObjectPart(objID); 8783
8784 part = World.GetSceneObjectPart(objID);
8138 // Currently only works for single prims without a sitting avatar 8785 // Currently only works for single prims without a sitting avatar
8139 if (part != null) 8786 if (part != null)
8140 { 8787 {
8141 Vector3 halfSize = part.Scale / 2.0f; 8788 float minX;
8142 LSL_Vector lower = (new LSL_Vector(halfSize)) * -1.0f; 8789 float maxX;
8143 LSL_Vector upper = new LSL_Vector(halfSize); 8790 float minY;
8791 float maxY;
8792 float minZ;
8793 float maxZ;
8794
8795 // This BBox is in sim coordinates, with the offset being
8796 // a contained point.
8797 Vector3[] offsets = Scene.GetCombinedBoundingBox(new List<SceneObjectGroup> { part.ParentGroup },
8798 out minX, out maxX, out minY, out maxY, out minZ, out maxZ);
8799
8800 minX -= offsets[0].X;
8801 maxX -= offsets[0].X;
8802 minY -= offsets[0].Y;
8803 maxY -= offsets[0].Y;
8804 minZ -= offsets[0].Z;
8805 maxZ -= offsets[0].Z;
8806
8807 LSL_Vector lower;
8808 LSL_Vector upper;
8809
8810 // Adjust to the documented error offsets (see LSL Wiki)
8811 lower = new LSL_Vector(minX + 0.05f, minY + 0.05f, minZ + 0.05f);
8812 upper = new LSL_Vector(maxX - 0.05f, maxY - 0.05f, maxZ - 0.05f);
8813
8814 if (lower.x > upper.x)
8815 lower.x = upper.x;
8816 if (lower.y > upper.y)
8817 lower.y = upper.y;
8818 if (lower.z > upper.z)
8819 lower.z = upper.z;
8820
8144 result.Add(lower); 8821 result.Add(lower);
8145 result.Add(upper); 8822 result.Add(upper);
8146 return result; 8823 return result;
@@ -8157,224 +8834,74 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8157 return new LSL_Vector(m_host.GetGeometricCenter()); 8834 return new LSL_Vector(m_host.GetGeometricCenter());
8158 } 8835 }
8159 8836
8160 public LSL_List GetEntityParams(ISceneEntity entity, LSL_List rules) 8837 public LSL_List llGetPrimitiveParams(LSL_List rules)
8161 { 8838 {
8162 LSL_List result = new LSL_List(); 8839 m_host.AddScriptLPS(1);
8163 LSL_List remaining = null;
8164 8840
8165 while (true) 8841 LSL_List result = new LSL_List();
8166 {
8167 if (entity is SceneObjectPart)
8168 remaining = GetPrimParams((SceneObjectPart)entity, rules, ref result);
8169 else
8170 remaining = GetAgentParams((ScenePresence)entity, rules, ref result);
8171 8842
8172 if (remaining == null || remaining.Length <= 2) 8843 LSL_List remaining = GetPrimParams(m_host, rules, ref result);
8173 return result;
8174 8844
8845 while ((object)remaining != null && remaining.Length > 2)
8846 {
8175 int linknumber = remaining.GetLSLIntegerItem(0); 8847 int linknumber = remaining.GetLSLIntegerItem(0);
8176 rules = remaining.GetSublist(1, -1); 8848 rules = remaining.GetSublist(1, -1);
8177 entity = GetLinkEntity(linknumber); 8849 List<SceneObjectPart> parts = GetLinkParts(linknumber);
8178 }
8179 }
8180 8850
8181 public LSL_List llGetPrimitiveParams(LSL_List rules) 8851 foreach (SceneObjectPart part in parts)
8182 { 8852 remaining = GetPrimParams(part, rules, ref result);
8183 m_host.AddScriptLPS(1); 8853 }
8184 8854
8185 return GetEntityParams(m_host, rules); 8855 return result;
8186 } 8856 }
8187 8857
8188 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules) 8858 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules)
8189 { 8859 {
8190 m_host.AddScriptLPS(1); 8860 m_host.AddScriptLPS(1);
8191 8861
8192 return GetEntityParams(GetLinkEntity(linknumber), rules); 8862 // acording to SL wiki this must indicate a single link number or link_root or link_this.
8193 } 8863 // keep other options as before
8194 8864
8195 public LSL_Vector GetAgentSize(ScenePresence sp) 8865 List<SceneObjectPart> parts;
8196 { 8866 List<ScenePresence> avatars;
8197 return new LSL_Vector(0.45, 0.6, sp.Appearance.AvatarHeight); 8867
8198 } 8868 LSL_List res = new LSL_List();
8869 LSL_List remaining = null;
8199 8870
8200 /// <summary> 8871 while (rules.Length > 0)
8201 /// Gets params for a seated avatar in a linkset.
8202 /// </summary>
8203 /// <returns></returns>
8204 /// <param name='sp'></param>
8205 /// <param name='rules'></param>
8206 /// <param name='res'></param>
8207 public LSL_List GetAgentParams(ScenePresence sp, LSL_List rules, ref LSL_List res)
8208 {
8209 int idx = 0;
8210 while (idx < rules.Length)
8211 { 8872 {
8212 int code = (int)rules.GetLSLIntegerItem(idx++); 8873 parts = GetLinkParts(linknumber);
8213 int remain = rules.Length-idx; 8874 avatars = GetLinkAvatars(linknumber);
8214 8875
8215 switch (code) 8876 remaining = null;
8877 foreach (SceneObjectPart part in parts)
8216 { 8878 {
8217 case (int)ScriptBaseClass.PRIM_MATERIAL: 8879 remaining = GetPrimParams(part, rules, ref res);
8218 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MATERIAL_FLESH)); 8880 }
8219 break; 8881 foreach (ScenePresence avatar in avatars)
8220 8882 {
8221 case (int)ScriptBaseClass.PRIM_PHYSICS: 8883 remaining = GetPrimParams(avatar, rules, ref res);
8222 res.Add(ScriptBaseClass.FALSE); 8884 }
8223 break;
8224
8225 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
8226 res.Add(ScriptBaseClass.FALSE);
8227 break;
8228
8229 case (int)ScriptBaseClass.PRIM_PHANTOM:
8230 res.Add(ScriptBaseClass.FALSE);
8231 break;
8232
8233 case (int)ScriptBaseClass.PRIM_POSITION:
8234 res.Add(new LSL_Vector(sp.AbsolutePosition));
8235 break;
8236
8237 case (int)ScriptBaseClass.PRIM_SIZE:
8238 res.Add(GetAgentSize(sp));
8239 break;
8240
8241 case (int)ScriptBaseClass.PRIM_ROTATION:
8242 res.Add(sp.GetWorldRotation());
8243 break;
8244
8245 case (int)ScriptBaseClass.PRIM_TYPE:
8246 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX));
8247 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT));
8248 res.Add(new LSL_Vector(0, 1, 0));
8249 res.Add(new LSL_Float(0));
8250 res.Add(new LSL_Vector(0, 0, 0));
8251 res.Add(new LSL_Vector(1, 1, 0));
8252 res.Add(new LSL_Vector(0, 0, 0));
8253 break;
8254
8255 case (int)ScriptBaseClass.PRIM_TEXTURE:
8256 if (remain < 1)
8257 return null;
8258
8259 int face = (int)rules.GetLSLIntegerItem(idx++);
8260 if (face > 21)
8261 break;
8262
8263 res.Add(new LSL_String(""));
8264 res.Add(ScriptBaseClass.ZERO_VECTOR);
8265 res.Add(ScriptBaseClass.ZERO_VECTOR);
8266 res.Add(new LSL_Float(0));
8267 break;
8268
8269 case (int)ScriptBaseClass.PRIM_COLOR:
8270 if (remain < 1)
8271 return null;
8272
8273 face = (int)rules.GetLSLIntegerItem(idx++);
8274 if (face > 21)
8275 break;
8276
8277 res.Add(ScriptBaseClass.ZERO_VECTOR);
8278 res.Add(new LSL_Float(0));
8279 break;
8280
8281 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8282 if (remain < 1)
8283 return null;
8284
8285 face = (int)rules.GetLSLIntegerItem(idx++);
8286 if (face > 21)
8287 break;
8288
8289 res.Add(ScriptBaseClass.PRIM_SHINY_NONE);
8290 res.Add(ScriptBaseClass.PRIM_BUMP_NONE);
8291 break;
8292
8293 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
8294 if (remain < 1)
8295 return null;
8296
8297 face = (int)rules.GetLSLIntegerItem(idx++);
8298 if (face > 21)
8299 break;
8300
8301 res.Add(ScriptBaseClass.FALSE);
8302 break;
8303
8304 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8305 res.Add(ScriptBaseClass.FALSE);
8306 res.Add(new LSL_Integer(0));
8307 res.Add(new LSL_Float(0));
8308 res.Add(new LSL_Float(0));
8309 res.Add(new LSL_Float(0));
8310 res.Add(new LSL_Float(0));
8311 res.Add(ScriptBaseClass.ZERO_VECTOR);
8312 break;
8313
8314 case (int)ScriptBaseClass.PRIM_TEXGEN:
8315 if (remain < 1)
8316 return null;
8317
8318 face = (int)rules.GetLSLIntegerItem(idx++);
8319 if (face > 21)
8320 break;
8321
8322 res.Add(ScriptBaseClass.PRIM_TEXGEN_DEFAULT);
8323 break;
8324
8325 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
8326 res.Add(ScriptBaseClass.FALSE);
8327 res.Add(ScriptBaseClass.ZERO_VECTOR);
8328 res.Add(ScriptBaseClass.ZERO_VECTOR);
8329 break;
8330
8331 case (int)ScriptBaseClass.PRIM_GLOW:
8332 if (remain < 1)
8333 return null;
8334
8335 face = (int)rules.GetLSLIntegerItem(idx++);
8336 if (face > 21)
8337 break;
8338
8339 res.Add(new LSL_Float(0));
8340 break;
8341
8342 case (int)ScriptBaseClass.PRIM_TEXT:
8343 res.Add(new LSL_String(""));
8344 res.Add(ScriptBaseClass.ZERO_VECTOR);
8345 res.Add(new LSL_Float(1));
8346 break;
8347
8348 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8349 res.Add(new LSL_Rotation(sp.Rotation));
8350 break;
8351
8352 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
8353 res.Add(new LSL_Vector(sp.OffsetPosition));
8354 break;
8355
8356 case (int)ScriptBaseClass.PRIM_SLICE:
8357 res.Add(new LSL_Vector(0, 1, 0));
8358 break;
8359
8360 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8361 if(remain < 3)
8362 return null;
8363 8885
8364 return rules.GetSublist(idx, -1); 8886 if ((object)remaining != null && remaining.Length > 0)
8887 {
8888 linknumber = remaining.GetLSLIntegerItem(0);
8889 rules = remaining.GetSublist(1, -1);
8365 } 8890 }
8891 else
8892 break;
8366 } 8893 }
8367 8894
8368 return null; 8895 return res;
8369 } 8896 }
8370 8897
8371 public LSL_List GetPrimParams(SceneObjectPart part, LSL_List rules, ref LSL_List res) 8898 public LSL_List GetPrimParams(SceneObjectPart part, LSL_List rules, ref LSL_List res)
8372 { 8899 {
8373 int idx = 0; 8900 int idx=0;
8374 while (idx < rules.Length) 8901 while (idx < rules.Length)
8375 { 8902 {
8376 int code = (int)rules.GetLSLIntegerItem(idx++); 8903 int code=(int)rules.GetLSLIntegerItem(idx++);
8377 int remain = rules.Length-idx; 8904 int remain=rules.Length-idx;
8378 8905
8379 switch (code) 8906 switch (code)
8380 { 8907 {
@@ -8404,19 +8931,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8404 break; 8931 break;
8405 8932
8406 case (int)ScriptBaseClass.PRIM_POSITION: 8933 case (int)ScriptBaseClass.PRIM_POSITION:
8407 LSL_Vector v = new LSL_Vector(part.AbsolutePosition); 8934 LSL_Vector v = new LSL_Vector(part.AbsolutePosition.X,
8408 8935 part.AbsolutePosition.Y,
8409 // For some reason, the part.AbsolutePosition.* values do not change if the 8936 part.AbsolutePosition.Z);
8410 // linkset is rotated; they always reflect the child prim's world position
8411 // as though the linkset is unrotated. This is incompatible behavior with SL's
8412 // implementation, so will break scripts imported from there (not to mention it
8413 // makes it more difficult to determine a child prim's actual inworld position).
8414 if (!part.IsRoot)
8415 {
8416 LSL_Vector rootPos = new LSL_Vector(m_host.ParentGroup.AbsolutePosition);
8417 v = ((v - rootPos) * llGetRootRotation()) + rootPos;
8418 }
8419
8420 res.Add(v); 8937 res.Add(v);
8421 break; 8938 break;
8422 8939
@@ -8586,30 +9103,56 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8586 if (remain < 1) 9103 if (remain < 1)
8587 return null; 9104 return null;
8588 9105
8589 face=(int)rules.GetLSLIntegerItem(idx++); 9106 face = (int)rules.GetLSLIntegerItem(idx++);
8590 9107
8591 tex = part.Shape.Textures; 9108 tex = part.Shape.Textures;
9109 int shiny;
8592 if (face == ScriptBaseClass.ALL_SIDES) 9110 if (face == ScriptBaseClass.ALL_SIDES)
8593 { 9111 {
8594 for (face = 0; face < GetNumberOfSides(part); face++) 9112 for (face = 0; face < GetNumberOfSides(part); face++)
8595 { 9113 {
8596 Primitive.TextureEntryFace texface = tex.GetFace((uint)face); 9114 Shininess shinyness = tex.GetFace((uint)face).Shiny;
8597 // Convert Shininess to PRIM_SHINY_* 9115 if (shinyness == Shininess.High)
8598 res.Add(new LSL_Integer((uint)texface.Shiny >> 6)); 9116 {
8599 // PRIM_BUMP_* 9117 shiny = ScriptBaseClass.PRIM_SHINY_HIGH;
8600 res.Add(new LSL_Integer((int)texface.Bump)); 9118 }
9119 else if (shinyness == Shininess.Medium)
9120 {
9121 shiny = ScriptBaseClass.PRIM_SHINY_MEDIUM;
9122 }
9123 else if (shinyness == Shininess.Low)
9124 {
9125 shiny = ScriptBaseClass.PRIM_SHINY_LOW;
9126 }
9127 else
9128 {
9129 shiny = ScriptBaseClass.PRIM_SHINY_NONE;
9130 }
9131 res.Add(new LSL_Integer(shiny));
9132 res.Add(new LSL_Integer((int)tex.GetFace((uint)face).Bump));
8601 } 9133 }
8602 } 9134 }
8603 else 9135 else
8604 { 9136 {
8605 if (face >= 0 && face < GetNumberOfSides(part)) 9137 Shininess shinyness = tex.GetFace((uint)face).Shiny;
9138 if (shinyness == Shininess.High)
8606 { 9139 {
8607 Primitive.TextureEntryFace texface = tex.GetFace((uint)face); 9140 shiny = ScriptBaseClass.PRIM_SHINY_HIGH;
8608 // Convert Shininess to PRIM_SHINY_*
8609 res.Add(new LSL_Integer((uint)texface.Shiny >> 6));
8610 // PRIM_BUMP_*
8611 res.Add(new LSL_Integer((int)texface.Bump));
8612 } 9141 }
9142 else if (shinyness == Shininess.Medium)
9143 {
9144 shiny = ScriptBaseClass.PRIM_SHINY_MEDIUM;
9145 }
9146 else if (shinyness == Shininess.Low)
9147 {
9148 shiny = ScriptBaseClass.PRIM_SHINY_LOW;
9149 }
9150 else
9151 {
9152 shiny = ScriptBaseClass.PRIM_SHINY_NONE;
9153 }
9154 res.Add(new LSL_Integer(shiny));
9155 res.Add(new LSL_Integer((int)tex.GetFace((uint)face).Bump));
8613 } 9156 }
8614 break; 9157 break;
8615 9158
@@ -8620,21 +9163,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8620 face = (int)rules.GetLSLIntegerItem(idx++); 9163 face = (int)rules.GetLSLIntegerItem(idx++);
8621 9164
8622 tex = part.Shape.Textures; 9165 tex = part.Shape.Textures;
9166 int fullbright;
8623 if (face == ScriptBaseClass.ALL_SIDES) 9167 if (face == ScriptBaseClass.ALL_SIDES)
8624 { 9168 {
8625 for (face = 0; face < GetNumberOfSides(part); face++) 9169 for (face = 0; face < GetNumberOfSides(part); face++)
8626 { 9170 {
8627 Primitive.TextureEntryFace texface = tex.GetFace((uint)face); 9171 if (tex.GetFace((uint)face).Fullbright == true)
8628 res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0)); 9172 {
9173 fullbright = ScriptBaseClass.TRUE;
9174 }
9175 else
9176 {
9177 fullbright = ScriptBaseClass.FALSE;
9178 }
9179 res.Add(new LSL_Integer(fullbright));
8629 } 9180 }
8630 } 9181 }
8631 else 9182 else
8632 { 9183 {
8633 if (face >= 0 && face < GetNumberOfSides(part)) 9184 if (tex.GetFace((uint)face).Fullbright == true)
8634 { 9185 {
8635 Primitive.TextureEntryFace texface = tex.GetFace((uint)face); 9186 fullbright = ScriptBaseClass.TRUE;
8636 res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0));
8637 } 9187 }
9188 else
9189 {
9190 fullbright = ScriptBaseClass.FALSE;
9191 }
9192 res.Add(new LSL_Integer(fullbright));
8638 } 9193 }
8639 break; 9194 break;
8640 9195
@@ -8656,27 +9211,36 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8656 break; 9211 break;
8657 9212
8658 case (int)ScriptBaseClass.PRIM_TEXGEN: 9213 case (int)ScriptBaseClass.PRIM_TEXGEN:
9214 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
8659 if (remain < 1) 9215 if (remain < 1)
8660 return null; 9216 return null;
8661 9217
8662 face=(int)rules.GetLSLIntegerItem(idx++); 9218 face = (int)rules.GetLSLIntegerItem(idx++);
8663 9219
8664 tex = part.Shape.Textures; 9220 tex = part.Shape.Textures;
8665 if (face == ScriptBaseClass.ALL_SIDES) 9221 if (face == ScriptBaseClass.ALL_SIDES)
8666 { 9222 {
8667 for (face = 0; face < GetNumberOfSides(part); face++) 9223 for (face = 0; face < GetNumberOfSides(part); face++)
8668 { 9224 {
8669 MappingType texgen = tex.GetFace((uint)face).TexMapType; 9225 if (tex.GetFace((uint)face).TexMapType == MappingType.Planar)
8670 // Convert MappingType to PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR etc. 9226 {
8671 res.Add(new LSL_Integer((uint)texgen >> 1)); 9227 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_PLANAR));
9228 }
9229 else
9230 {
9231 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
9232 }
8672 } 9233 }
8673 } 9234 }
8674 else 9235 else
8675 { 9236 {
8676 if (face >= 0 && face < GetNumberOfSides(part)) 9237 if (tex.GetFace((uint)face).TexMapType == MappingType.Planar)
9238 {
9239 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_PLANAR));
9240 }
9241 else
8677 { 9242 {
8678 MappingType texgen = tex.GetFace((uint)face).TexMapType; 9243 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
8679 res.Add(new LSL_Integer((uint)texgen >> 1));
8680 } 9244 }
8681 } 9245 }
8682 break; 9246 break;
@@ -8700,24 +9264,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8700 if (remain < 1) 9264 if (remain < 1)
8701 return null; 9265 return null;
8702 9266
8703 face=(int)rules.GetLSLIntegerItem(idx++); 9267 face = (int)rules.GetLSLIntegerItem(idx++);
8704 9268
8705 tex = part.Shape.Textures; 9269 tex = part.Shape.Textures;
9270 float primglow;
8706 if (face == ScriptBaseClass.ALL_SIDES) 9271 if (face == ScriptBaseClass.ALL_SIDES)
8707 { 9272 {
8708 for (face = 0; face < GetNumberOfSides(part); face++) 9273 for (face = 0; face < GetNumberOfSides(part); face++)
8709 { 9274 {
8710 Primitive.TextureEntryFace texface = tex.GetFace((uint)face); 9275 primglow = tex.GetFace((uint)face).Glow;
8711 res.Add(new LSL_Float(texface.Glow)); 9276 res.Add(new LSL_Float(primglow));
8712 } 9277 }
8713 } 9278 }
8714 else 9279 else
8715 { 9280 {
8716 if (face >= 0 && face < GetNumberOfSides(part)) 9281 primglow = tex.GetFace((uint)face).Glow;
8717 { 9282 res.Add(new LSL_Float(primglow));
8718 Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
8719 res.Add(new LSL_Float(texface.Glow));
8720 }
8721 } 9283 }
8722 break; 9284 break;
8723 9285
@@ -8729,15 +9291,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8729 textColor.B)); 9291 textColor.B));
8730 res.Add(new LSL_Float(textColor.A)); 9292 res.Add(new LSL_Float(textColor.A));
8731 break; 9293 break;
9294
8732 case (int)ScriptBaseClass.PRIM_NAME: 9295 case (int)ScriptBaseClass.PRIM_NAME:
8733 res.Add(new LSL_String(part.Name)); 9296 res.Add(new LSL_String(part.Name));
8734 break; 9297 break;
9298
8735 case (int)ScriptBaseClass.PRIM_DESC: 9299 case (int)ScriptBaseClass.PRIM_DESC:
8736 res.Add(new LSL_String(part.Description)); 9300 res.Add(new LSL_String(part.Description));
8737 break; 9301 break;
8738 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 9302 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8739 res.Add(new LSL_Rotation(part.RotationOffset)); 9303 res.Add(new LSL_Rotation(part.RotationOffset));
8740 break; 9304 break;
9305
8741 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 9306 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
8742 res.Add(new LSL_Vector(GetPartLocalPos(part))); 9307 res.Add(new LSL_Vector(GetPartLocalPos(part)));
8743 break; 9308 break;
@@ -9348,8 +9913,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9348 // The function returns an ordered list 9913 // The function returns an ordered list
9349 // representing the tokens found in the supplied 9914 // representing the tokens found in the supplied
9350 // sources string. If two successive tokenizers 9915 // sources string. If two successive tokenizers
9351 // are encountered, then a NULL entry is added 9916 // are encountered, then a null-string entry is
9352 // to the list. 9917 // added to the list.
9353 // 9918 //
9354 // It is a precondition that the source and 9919 // It is a precondition that the source and
9355 // toekizer lisst are non-null. If they are null, 9920 // toekizer lisst are non-null. If they are null,
@@ -9357,7 +9922,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9357 // while their lengths are being determined. 9922 // while their lengths are being determined.
9358 // 9923 //
9359 // A small amount of working memoryis required 9924 // A small amount of working memoryis required
9360 // of approximately 8*#tokenizers. 9925 // of approximately 8*#tokenizers + 8*srcstrlen.
9361 // 9926 //
9362 // There are many ways in which this function 9927 // There are many ways in which this function
9363 // can be implemented, this implementation is 9928 // can be implemented, this implementation is
@@ -9373,155 +9938,124 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9373 // and eliminates redundant tokenizers as soon 9938 // and eliminates redundant tokenizers as soon
9374 // as is possible. 9939 // as is possible.
9375 // 9940 //
9376 // The implementation tries to avoid any copying 9941 // The implementation tries to minimize temporary
9377 // of arrays or other objects. 9942 // garbage generation.
9378 // </remarks> 9943 // </remarks>
9379 9944
9380 private LSL_List ParseString(string src, LSL_List separators, LSL_List spacers, bool keepNulls) 9945 public LSL_List llParseStringKeepNulls(string src, LSL_List separators, LSL_List spacers)
9381 { 9946 {
9382 int beginning = 0; 9947 return ParseString2List(src, separators, spacers, true);
9383 int srclen = src.Length; 9948 }
9384 int seplen = separators.Length;
9385 object[] separray = separators.Data;
9386 int spclen = spacers.Length;
9387 object[] spcarray = spacers.Data;
9388 int mlen = seplen+spclen;
9389
9390 int[] offset = new int[mlen+1];
9391 bool[] active = new bool[mlen];
9392
9393 int best;
9394 int j;
9395
9396 // Initial capacity reduces resize cost
9397 9949
9398 LSL_List tokens = new LSL_List(); 9950 private LSL_List ParseString2List(string src, LSL_List separators, LSL_List spacers, bool keepNulls)
9951 {
9952 int srclen = src.Length;
9953 int seplen = separators.Length;
9954 object[] separray = separators.Data;
9955 int spclen = spacers.Length;
9956 object[] spcarray = spacers.Data;
9957 int dellen = 0;
9958 string[] delarray = new string[seplen+spclen];
9399 9959
9400 // All entries are initially valid 9960 int outlen = 0;
9961 string[] outarray = new string[srclen*2+1];
9401 9962
9402 for (int i = 0; i < mlen; i++) 9963 int i, j;
9403 active[i] = true; 9964 string d;
9404 9965
9405 offset[mlen] = srclen; 9966 m_host.AddScriptLPS(1);
9406 9967
9407 while (beginning < srclen) 9968 /*
9969 * Convert separator and spacer lists to C# strings.
9970 * Also filter out null strings so we don't hang.
9971 */
9972 for (i = 0; i < seplen; i ++)
9408 { 9973 {
9974 d = separray[i].ToString();
9975 if (d.Length > 0)
9976 {
9977 delarray[dellen++] = d;
9978 }
9979 }
9980 seplen = dellen;
9409 9981
9410 best = mlen; // as bad as it gets 9982 for (i = 0; i < spclen; i ++)
9983 {
9984 d = spcarray[i].ToString();
9985 if (d.Length > 0)
9986 {
9987 delarray[dellen++] = d;
9988 }
9989 }
9411 9990
9412 // Scan for separators 9991 /*
9992 * Scan through source string from beginning to end.
9993 */
9994 for (i = 0;;)
9995 {
9413 9996
9414 for (j = 0; j < seplen; j++) 9997 /*
9998 * Find earliest delimeter in src starting at i (if any).
9999 */
10000 int earliestDel = -1;
10001 int earliestSrc = srclen;
10002 string earliestStr = null;
10003 for (j = 0; j < dellen; j ++)
9415 { 10004 {
9416 if (separray[j].ToString() == String.Empty) 10005 d = delarray[j];
9417 active[j] = false; 10006 if (d != null)
9418
9419 if (active[j])
9420 { 10007 {
9421 // scan all of the markers 10008 int index = src.IndexOf(d, i);
9422 if ((offset[j] = src.IndexOf(separray[j].ToString(), beginning)) == -1) 10009 if (index < 0)
9423 { 10010 {
9424 // not present at all 10011 delarray[j] = null; // delim nowhere in src, don't check it anymore
9425 active[j] = false;
9426 } 10012 }
9427 else 10013 else if (index < earliestSrc)
9428 { 10014 {
9429 // present and correct 10015 earliestSrc = index; // where delimeter starts in source string
9430 if (offset[j] < offset[best]) 10016 earliestDel = j; // where delimeter is in delarray[]
9431 { 10017 earliestStr = d; // the delimeter string from delarray[]
9432 // closest so far 10018 if (index == i) break; // can't do any better than found at beg of string
9433 best = j;
9434 if (offset[best] == beginning)
9435 break;
9436 }
9437 } 10019 }
9438 } 10020 }
9439 } 10021 }
9440 10022
9441 // Scan for spacers 10023 /*
9442 10024 * Output source string starting at i through start of earliest delimeter.
9443 if (offset[best] != beginning) 10025 */
10026 if (keepNulls || (earliestSrc > i))
9444 { 10027 {
9445 for (j = seplen; (j < mlen) && (offset[best] > beginning); j++) 10028 outarray[outlen++] = src.Substring(i, earliestSrc - i);
9446 {
9447 if (spcarray[j-seplen].ToString() == String.Empty)
9448 active[j] = false;
9449
9450 if (active[j])
9451 {
9452 // scan all of the markers
9453 if ((offset[j] = src.IndexOf(spcarray[j-seplen].ToString(), beginning)) == -1)
9454 {
9455 // not present at all
9456 active[j] = false;
9457 }
9458 else
9459 {
9460 // present and correct
9461 if (offset[j] < offset[best])
9462 {
9463 // closest so far
9464 best = j;
9465 }
9466 }
9467 }
9468 }
9469 } 10029 }
9470 10030
9471 // This is the normal exit from the scanning loop 10031 /*
10032 * If no delimeter found at or after i, we're done scanning.
10033 */
10034 if (earliestDel < 0) break;
9472 10035
9473 if (best == mlen) 10036 /*
10037 * If delimeter was a spacer, output the spacer.
10038 */
10039 if (earliestDel >= seplen)
9474 { 10040 {
9475 // no markers were found on this pass 10041 outarray[outlen++] = earliestStr;
9476 // so we're pretty much done
9477 if ((keepNulls) || ((!keepNulls) && (srclen - beginning) > 0))
9478 tokens.Add(new LSL_String(src.Substring(beginning, srclen - beginning)));
9479 break;
9480 } 10042 }
9481 10043
9482 // Otherwise we just add the newly delimited token 10044 /*
9483 // and recalculate where the search should continue. 10045 * Look at rest of src string following delimeter.
9484 if ((keepNulls) || ((!keepNulls) && (offset[best] - beginning) > 0)) 10046 */
9485 tokens.Add(new LSL_String(src.Substring(beginning,offset[best]-beginning))); 10047 i = earliestSrc + earliestStr.Length;
9486
9487 if (best < seplen)
9488 {
9489 beginning = offset[best] + (separray[best].ToString()).Length;
9490 }
9491 else
9492 {
9493 beginning = offset[best] + (spcarray[best - seplen].ToString()).Length;
9494 string str = spcarray[best - seplen].ToString();
9495 if ((keepNulls) || ((!keepNulls) && (str.Length > 0)))
9496 tokens.Add(new LSL_String(str));
9497 }
9498 } 10048 }
9499 10049
9500 // This an awkward an not very intuitive boundary case. If the 10050 /*
9501 // last substring is a tokenizer, then there is an implied trailing 10051 * Make up an exact-sized output array suitable for an LSL_List object.
9502 // null list entry. Hopefully the single comparison will not be too 10052 */
9503 // arduous. Alternatively the 'break' could be replced with a return 10053 object[] outlist = new object[outlen];
9504 // but that's shabby programming. 10054 for (i = 0; i < outlen; i ++)
9505
9506 if ((beginning == srclen) && (keepNulls))
9507 { 10055 {
9508 if (srclen != 0) 10056 outlist[i] = new LSL_String(outarray[i]);
9509 tokens.Add(new LSL_String(""));
9510 } 10057 }
9511 10058 return new LSL_List(outlist);
9512 return tokens;
9513 }
9514
9515 public LSL_List llParseString2List(string src, LSL_List separators, LSL_List spacers)
9516 {
9517 m_host.AddScriptLPS(1);
9518 return this.ParseString(src, separators, spacers, false);
9519 }
9520
9521 public LSL_List llParseStringKeepNulls(string src, LSL_List separators, LSL_List spacers)
9522 {
9523 m_host.AddScriptLPS(1);
9524 return this.ParseString(src, separators, spacers, true);
9525 } 10059 }
9526 10060
9527 public LSL_Integer llGetObjectPermMask(int mask) 10061 public LSL_Integer llGetObjectPermMask(int mask)
@@ -9616,6 +10150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9616 case 4: 10150 case 4:
9617 return (int)item.NextPermissions; 10151 return (int)item.NextPermissions;
9618 } 10152 }
10153 m_host.TaskInventory.LockItemsForRead(false);
9619 10154
9620 return -1; 10155 return -1;
9621 } 10156 }
@@ -9819,31 +10354,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9819 UUID key = new UUID(); 10354 UUID key = new UUID();
9820 if (UUID.TryParse(id, out key)) 10355 if (UUID.TryParse(id, out key))
9821 { 10356 {
9822 try 10357 // return total object mass
9823 { 10358 SceneObjectPart part = World.GetSceneObjectPart(key);
9824 SceneObjectPart obj = World.GetSceneObjectPart(World.Entities[key].LocalId); 10359 if (part != null)
9825 if (obj != null) 10360 return part.ParentGroup.GetMass();
9826 return (double)obj.GetMass(); 10361
9827 // the object is null so the key is for an avatar 10362 // the object is null so the key is for an avatar
9828 ScenePresence avatar = World.GetScenePresence(key); 10363 ScenePresence avatar = World.GetScenePresence(key);
9829 if (avatar != null) 10364 if (avatar != null)
9830 if (avatar.IsChildAgent)
9831 // reference http://www.lslwiki.net/lslwiki/wakka.php?wakka=llGetObjectMass
9832 // child agents have a mass of 1.0
9833 return 1;
9834 else
9835 return (double)avatar.GetMass();
9836 }
9837 catch (KeyNotFoundException)
9838 { 10365 {
9839 return 0; // The Object/Agent not in the region so just return zero 10366 if (avatar.IsChildAgent)
10367 {
10368 // reference http://www.lslwiki.net/lslwiki/wakka.php?wakka=llGetObjectMass
10369 // child agents have a mass of 1.0
10370 return 1;
10371 }
10372 else
10373 {
10374 return (double)avatar.GetMass();
10375 }
9840 } 10376 }
9841 } 10377 }
9842 return 0; 10378 return 0;
9843 } 10379 }
9844 10380
9845 /// <summary> 10381 /// <summary>
9846 /// illListReplaceList removes the sub-list defined by the inclusive indices 10382 /// llListReplaceList removes the sub-list defined by the inclusive indices
9847 /// start and end and inserts the src list in its place. The inclusive 10383 /// start and end and inserts the src list in its place. The inclusive
9848 /// nature of the indices means that at least one element must be deleted 10384 /// nature of the indices means that at least one element must be deleted
9849 /// if the indices are within the bounds of the existing list. I.e. 2,2 10385 /// if the indices are within the bounds of the existing list. I.e. 2,2
@@ -9900,16 +10436,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9900 // based upon end. Note that if end exceeds the upper 10436 // based upon end. Note that if end exceeds the upper
9901 // bound in this case, the entire destination list 10437 // bound in this case, the entire destination list
9902 // is removed. 10438 // is removed.
9903 else 10439 else if (start == 0)
9904 { 10440 {
9905 if (end + 1 < dest.Length) 10441 if (end + 1 < dest.Length)
9906 {
9907 return src + dest.GetSublist(end + 1, -1); 10442 return src + dest.GetSublist(end + 1, -1);
9908 }
9909 else 10443 else
9910 {
9911 return src; 10444 return src;
9912 } 10445 }
10446 else // Start < 0
10447 {
10448 if (end + 1 < dest.Length)
10449 return dest.GetSublist(end + 1, -1);
10450 else
10451 return new LSL_List();
9913 } 10452 }
9914 } 10453 }
9915 // Finally, if start > end, we strip away a prefix and 10454 // Finally, if start > end, we strip away a prefix and
@@ -9960,17 +10499,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9960 int width = 0; 10499 int width = 0;
9961 int height = 0; 10500 int height = 0;
9962 10501
9963 ParcelMediaCommandEnum? commandToSend = null; 10502 uint commandToSend = 0;
9964 float time = 0.0f; // default is from start 10503 float time = 0.0f; // default is from start
9965 10504
9966 ScenePresence presence = null; 10505 ScenePresence presence = null;
9967 10506
9968 for (int i = 0; i < commandList.Data.Length; i++) 10507 for (int i = 0; i < commandList.Data.Length; i++)
9969 { 10508 {
9970 ParcelMediaCommandEnum command = (ParcelMediaCommandEnum)commandList.Data[i]; 10509 uint command = (uint)(commandList.GetLSLIntegerItem(i));
9971 switch (command) 10510 switch (command)
9972 { 10511 {
9973 case ParcelMediaCommandEnum.Agent: 10512 case (uint)ParcelMediaCommandEnum.Agent:
9974 // we send only to one agent 10513 // we send only to one agent
9975 if ((i + 1) < commandList.Length) 10514 if ((i + 1) < commandList.Length)
9976 { 10515 {
@@ -9987,25 +10526,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9987 } 10526 }
9988 break; 10527 break;
9989 10528
9990 case ParcelMediaCommandEnum.Loop: 10529 case (uint)ParcelMediaCommandEnum.Loop:
9991 loop = 1; 10530 loop = 1;
9992 commandToSend = command; 10531 commandToSend = command;
9993 update = true; //need to send the media update packet to set looping 10532 update = true; //need to send the media update packet to set looping
9994 break; 10533 break;
9995 10534
9996 case ParcelMediaCommandEnum.Play: 10535 case (uint)ParcelMediaCommandEnum.Play:
9997 loop = 0; 10536 loop = 0;
9998 commandToSend = command; 10537 commandToSend = command;
9999 update = true; //need to send the media update packet to make sure it doesn't loop 10538 update = true; //need to send the media update packet to make sure it doesn't loop
10000 break; 10539 break;
10001 10540
10002 case ParcelMediaCommandEnum.Pause: 10541 case (uint)ParcelMediaCommandEnum.Pause:
10003 case ParcelMediaCommandEnum.Stop: 10542 case (uint)ParcelMediaCommandEnum.Stop:
10004 case ParcelMediaCommandEnum.Unload: 10543 case (uint)ParcelMediaCommandEnum.Unload:
10005 commandToSend = command; 10544 commandToSend = command;
10006 break; 10545 break;
10007 10546
10008 case ParcelMediaCommandEnum.Url: 10547 case (uint)ParcelMediaCommandEnum.Url:
10009 if ((i + 1) < commandList.Length) 10548 if ((i + 1) < commandList.Length)
10010 { 10549 {
10011 if (commandList.Data[i + 1] is LSL_String) 10550 if (commandList.Data[i + 1] is LSL_String)
@@ -10018,7 +10557,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10018 } 10557 }
10019 break; 10558 break;
10020 10559
10021 case ParcelMediaCommandEnum.Texture: 10560 case (uint)ParcelMediaCommandEnum.Texture:
10022 if ((i + 1) < commandList.Length) 10561 if ((i + 1) < commandList.Length)
10023 { 10562 {
10024 if (commandList.Data[i + 1] is LSL_String) 10563 if (commandList.Data[i + 1] is LSL_String)
@@ -10031,7 +10570,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10031 } 10570 }
10032 break; 10571 break;
10033 10572
10034 case ParcelMediaCommandEnum.Time: 10573 case (uint)ParcelMediaCommandEnum.Time:
10035 if ((i + 1) < commandList.Length) 10574 if ((i + 1) < commandList.Length)
10036 { 10575 {
10037 if (commandList.Data[i + 1] is LSL_Float) 10576 if (commandList.Data[i + 1] is LSL_Float)
@@ -10043,7 +10582,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10043 } 10582 }
10044 break; 10583 break;
10045 10584
10046 case ParcelMediaCommandEnum.AutoAlign: 10585 case (uint)ParcelMediaCommandEnum.AutoAlign:
10047 if ((i + 1) < commandList.Length) 10586 if ((i + 1) < commandList.Length)
10048 { 10587 {
10049 if (commandList.Data[i + 1] is LSL_Integer) 10588 if (commandList.Data[i + 1] is LSL_Integer)
@@ -10057,7 +10596,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10057 } 10596 }
10058 break; 10597 break;
10059 10598
10060 case ParcelMediaCommandEnum.Type: 10599 case (uint)ParcelMediaCommandEnum.Type:
10061 if ((i + 1) < commandList.Length) 10600 if ((i + 1) < commandList.Length)
10062 { 10601 {
10063 if (commandList.Data[i + 1] is LSL_String) 10602 if (commandList.Data[i + 1] is LSL_String)
@@ -10070,7 +10609,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10070 } 10609 }
10071 break; 10610 break;
10072 10611
10073 case ParcelMediaCommandEnum.Desc: 10612 case (uint)ParcelMediaCommandEnum.Desc:
10074 if ((i + 1) < commandList.Length) 10613 if ((i + 1) < commandList.Length)
10075 { 10614 {
10076 if (commandList.Data[i + 1] is LSL_String) 10615 if (commandList.Data[i + 1] is LSL_String)
@@ -10083,7 +10622,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10083 } 10622 }
10084 break; 10623 break;
10085 10624
10086 case ParcelMediaCommandEnum.Size: 10625 case (uint)ParcelMediaCommandEnum.Size:
10087 if ((i + 2) < commandList.Length) 10626 if ((i + 2) < commandList.Length)
10088 { 10627 {
10089 if (commandList.Data[i + 1] is LSL_Integer) 10628 if (commandList.Data[i + 1] is LSL_Integer)
@@ -10153,7 +10692,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10153 } 10692 }
10154 } 10693 }
10155 10694
10156 if (commandToSend != null) 10695 if (commandToSend != 0)
10157 { 10696 {
10158 // the commandList contained a start/stop/... command, too 10697 // the commandList contained a start/stop/... command, too
10159 if (presence == null) 10698 if (presence == null)
@@ -10190,7 +10729,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10190 10729
10191 if (aList.Data[i] != null) 10730 if (aList.Data[i] != null)
10192 { 10731 {
10193 switch ((ParcelMediaCommandEnum) aList.Data[i]) 10732 switch ((ParcelMediaCommandEnum) Convert.ToInt32(aList.Data[i].ToString()))
10194 { 10733 {
10195 case ParcelMediaCommandEnum.Url: 10734 case ParcelMediaCommandEnum.Url:
10196 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaURL)); 10735 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaURL));
@@ -10247,15 +10786,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10247 10786
10248 if (quick_pay_buttons.Data.Length < 4) 10787 if (quick_pay_buttons.Data.Length < 4)
10249 { 10788 {
10250 LSLError("List must have at least 4 elements"); 10789 int x;
10251 return; 10790 for (x=quick_pay_buttons.Data.Length; x<= 4; x++)
10791 {
10792 quick_pay_buttons.Add(ScriptBaseClass.PAY_HIDE);
10793 }
10252 } 10794 }
10253 m_host.ParentGroup.RootPart.PayPrice[0]=price; 10795 int[] nPrice = new int[5];
10254 10796 nPrice[0] = price;
10255 m_host.ParentGroup.RootPart.PayPrice[1]=(LSL_Integer)quick_pay_buttons.Data[0]; 10797 nPrice[1] = quick_pay_buttons.GetLSLIntegerItem(0);
10256 m_host.ParentGroup.RootPart.PayPrice[2]=(LSL_Integer)quick_pay_buttons.Data[1]; 10798 nPrice[2] = quick_pay_buttons.GetLSLIntegerItem(1);
10257 m_host.ParentGroup.RootPart.PayPrice[3]=(LSL_Integer)quick_pay_buttons.Data[2]; 10799 nPrice[3] = quick_pay_buttons.GetLSLIntegerItem(2);
10258 m_host.ParentGroup.RootPart.PayPrice[4]=(LSL_Integer)quick_pay_buttons.Data[3]; 10800 nPrice[4] = quick_pay_buttons.GetLSLIntegerItem(3);
10801 m_host.ParentGroup.RootPart.PayPrice = nPrice;
10259 m_host.ParentGroup.HasGroupChanged = true; 10802 m_host.ParentGroup.HasGroupChanged = true;
10260 } 10803 }
10261 10804
@@ -10272,7 +10815,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10272 return Vector3.Zero; 10815 return Vector3.Zero;
10273 } 10816 }
10274 10817
10275 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10818// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10819 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10276 if (presence != null) 10820 if (presence != null)
10277 { 10821 {
10278 LSL_Vector pos = new LSL_Vector(presence.CameraPosition); 10822 LSL_Vector pos = new LSL_Vector(presence.CameraPosition);
@@ -10295,7 +10839,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10295 return Quaternion.Identity; 10839 return Quaternion.Identity;
10296 } 10840 }
10297 10841
10298 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10842// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10843 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10299 if (presence != null) 10844 if (presence != null)
10300 { 10845 {
10301 return new LSL_Rotation(presence.CameraRotation); 10846 return new LSL_Rotation(presence.CameraRotation);
@@ -10355,14 +10900,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10355 { 10900 {
10356 m_host.AddScriptLPS(1); 10901 m_host.AddScriptLPS(1);
10357 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0); 10902 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
10358 if (detectedParams == null) return; // only works on the first detected avatar 10903 if (detectedParams == null)
10359 10904 {
10905 if (m_host.ParentGroup.IsAttachment == true)
10906 {
10907 detectedParams = new DetectParams();
10908 detectedParams.Key = m_host.OwnerID;
10909 }
10910 else
10911 {
10912 return;
10913 }
10914 }
10915
10360 ScenePresence avatar = World.GetScenePresence(detectedParams.Key); 10916 ScenePresence avatar = World.GetScenePresence(detectedParams.Key);
10361 if (avatar != null) 10917 if (avatar != null)
10362 { 10918 {
10363 avatar.ControllingClient.SendScriptTeleportRequest(m_host.Name, 10919 avatar.ControllingClient.SendScriptTeleportRequest(m_host.Name,
10364 simname, pos, lookAt); 10920 simname, pos, lookAt);
10365 } 10921 }
10922
10366 ScriptSleep(1000); 10923 ScriptSleep(1000);
10367 } 10924 }
10368 10925
@@ -10486,12 +11043,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10486 11043
10487 SortedDictionary<int, float> parameters = new SortedDictionary<int, float>(); 11044 SortedDictionary<int, float> parameters = new SortedDictionary<int, float>();
10488 object[] data = rules.Data; 11045 object[] data = rules.Data;
10489 for (int i = 0; i < data.Length; ++i) { 11046 for (int i = 0; i < data.Length; ++i)
11047 {
10490 int type = Convert.ToInt32(data[i++].ToString()); 11048 int type = Convert.ToInt32(data[i++].ToString());
10491 if (i >= data.Length) break; // odd number of entries => ignore the last 11049 if (i >= data.Length) break; // odd number of entries => ignore the last
10492 11050
10493 // some special cases: Vector parameters are split into 3 float parameters (with type+1, type+2, type+3) 11051 // some special cases: Vector parameters are split into 3 float parameters (with type+1, type+2, type+3)
10494 switch (type) { 11052 switch (type)
11053 {
10495 case ScriptBaseClass.CAMERA_FOCUS: 11054 case ScriptBaseClass.CAMERA_FOCUS:
10496 case ScriptBaseClass.CAMERA_FOCUS_OFFSET: 11055 case ScriptBaseClass.CAMERA_FOCUS_OFFSET:
10497 case ScriptBaseClass.CAMERA_POSITION: 11056 case ScriptBaseClass.CAMERA_POSITION:
@@ -10596,19 +11155,65 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10596 public LSL_String llXorBase64StringsCorrect(string str1, string str2) 11155 public LSL_String llXorBase64StringsCorrect(string str1, string str2)
10597 { 11156 {
10598 m_host.AddScriptLPS(1); 11157 m_host.AddScriptLPS(1);
10599 string ret = String.Empty; 11158
10600 string src1 = llBase64ToString(str1); 11159 if (str1 == String.Empty)
10601 string src2 = llBase64ToString(str2); 11160 return String.Empty;
10602 int c = 0; 11161 if (str2 == String.Empty)
10603 for (int i = 0; i < src1.Length; i++) 11162 return str1;
11163
11164 int len = str2.Length;
11165 if ((len % 4) != 0) // LL is EVIL!!!!
11166 {
11167 while (str2.EndsWith("="))
11168 str2 = str2.Substring(0, str2.Length - 1);
11169
11170 len = str2.Length;
11171 int mod = len % 4;
11172
11173 if (mod == 1)
11174 str2 = str2.Substring(0, str2.Length - 1);
11175 else if (mod == 2)
11176 str2 += "==";
11177 else if (mod == 3)
11178 str2 += "=";
11179 }
11180
11181 byte[] data1;
11182 byte[] data2;
11183 try
11184 {
11185 data1 = Convert.FromBase64String(str1);
11186 data2 = Convert.FromBase64String(str2);
11187 }
11188 catch (Exception)
11189 {
11190 return new LSL_String(String.Empty);
11191 }
11192
11193 byte[] d2 = new Byte[data1.Length];
11194 int pos = 0;
11195
11196 if (data1.Length <= data2.Length)
11197 {
11198 Array.Copy(data2, 0, d2, 0, data1.Length);
11199 }
11200 else
10604 { 11201 {
10605 ret += (char) (src1[i] ^ src2[c]); 11202 while (pos < data1.Length)
11203 {
11204 len = data1.Length - pos;
11205 if (len > data2.Length)
11206 len = data2.Length;
10606 11207
10607 c++; 11208 Array.Copy(data2, 0, d2, pos, len);
10608 if (c >= src2.Length) 11209 pos += len;
10609 c = 0; 11210 }
10610 } 11211 }
10611 return llStringToBase64(ret); 11212
11213 for (pos = 0 ; pos < data1.Length ; pos++ )
11214 data1[pos] ^= d2[pos];
11215
11216 return Convert.ToBase64String(data1);
10612 } 11217 }
10613 11218
10614 public LSL_String llHTTPRequest(string url, LSL_List parameters, string body) 11219 public LSL_String llHTTPRequest(string url, LSL_List parameters, string body)
@@ -10712,16 +11317,72 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10712 if (userAgent != null) 11317 if (userAgent != null)
10713 httpHeaders["User-Agent"] = userAgent; 11318 httpHeaders["User-Agent"] = userAgent;
10714 11319
11320 // See if the URL contains any header hacks
11321 string[] urlParts = url.Split(new char[] {'\n'});
11322 if (urlParts.Length > 1)
11323 {
11324 // Iterate the passed headers and parse them
11325 for (int i = 1 ; i < urlParts.Length ; i++ )
11326 {
11327 // The rest of those would be added to the body in SL.
11328 // Let's not do that.
11329 if (urlParts[i] == String.Empty)
11330 break;
11331
11332 // See if this could be a valid header
11333 string[] headerParts = urlParts[i].Split(new char[] {':'}, 2);
11334 if (headerParts.Length != 2)
11335 continue;
11336
11337 string headerName = headerParts[0].Trim();
11338 string headerValue = headerParts[1].Trim();
11339
11340 // Filter out headers that could be used to abuse
11341 // another system or cloak the request
11342 if (headerName.ToLower() == "x-secondlife-shard" ||
11343 headerName.ToLower() == "x-secondlife-object-name" ||
11344 headerName.ToLower() == "x-secondlife-object-key" ||
11345 headerName.ToLower() == "x-secondlife-region" ||
11346 headerName.ToLower() == "x-secondlife-local-position" ||
11347 headerName.ToLower() == "x-secondlife-local-velocity" ||
11348 headerName.ToLower() == "x-secondlife-local-rotation" ||
11349 headerName.ToLower() == "x-secondlife-owner-name" ||
11350 headerName.ToLower() == "x-secondlife-owner-key" ||
11351 headerName.ToLower() == "connection" ||
11352 headerName.ToLower() == "content-length" ||
11353 headerName.ToLower() == "from" ||
11354 headerName.ToLower() == "host" ||
11355 headerName.ToLower() == "proxy-authorization" ||
11356 headerName.ToLower() == "referer" ||
11357 headerName.ToLower() == "trailer" ||
11358 headerName.ToLower() == "transfer-encoding" ||
11359 headerName.ToLower() == "via" ||
11360 headerName.ToLower() == "authorization")
11361 continue;
11362
11363 httpHeaders[headerName] = headerValue;
11364 }
11365
11366 // Finally, strip any protocol specifier from the URL
11367 url = urlParts[0].Trim();
11368 int idx = url.IndexOf(" HTTP/");
11369 if (idx != -1)
11370 url = url.Substring(0, idx);
11371 }
11372
10715 string authregex = @"^(https?:\/\/)(\w+):(\w+)@(.*)$"; 11373 string authregex = @"^(https?:\/\/)(\w+):(\w+)@(.*)$";
10716 Regex r = new Regex(authregex); 11374 Regex r = new Regex(authregex);
10717 int[] gnums = r.GetGroupNumbers(); 11375 int[] gnums = r.GetGroupNumbers();
10718 Match m = r.Match(url); 11376 Match m = r.Match(url);
10719 if (m.Success) { 11377 if (m.Success)
10720 for (int i = 1; i < gnums.Length; i++) { 11378 {
11379 for (int i = 1; i < gnums.Length; i++)
11380 {
10721 //System.Text.RegularExpressions.Group g = m.Groups[gnums[i]]; 11381 //System.Text.RegularExpressions.Group g = m.Groups[gnums[i]];
10722 //CaptureCollection cc = g.Captures; 11382 //CaptureCollection cc = g.Captures;
10723 } 11383 }
10724 if (m.Groups.Count == 5) { 11384 if (m.Groups.Count == 5)
11385 {
10725 httpHeaders["Authorization"] = String.Format("Basic {0}", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(m.Groups[2].ToString() + ":" + m.Groups[3].ToString()))); 11386 httpHeaders["Authorization"] = String.Format("Basic {0}", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(m.Groups[2].ToString() + ":" + m.Groups[3].ToString())));
10726 url = m.Groups[1].ToString() + m.Groups[4].ToString(); 11387 url = m.Groups[1].ToString() + m.Groups[4].ToString();
10727 } 11388 }
@@ -10924,6 +11585,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10924 11585
10925 LSL_List ret = new LSL_List(); 11586 LSL_List ret = new LSL_List();
10926 UUID key = new UUID(); 11587 UUID key = new UUID();
11588
11589
10927 if (UUID.TryParse(id, out key)) 11590 if (UUID.TryParse(id, out key))
10928 { 11591 {
10929 ScenePresence av = World.GetScenePresence(key); 11592 ScenePresence av = World.GetScenePresence(key);
@@ -10941,13 +11604,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10941 ret.Add(new LSL_String("")); 11604 ret.Add(new LSL_String(""));
10942 break; 11605 break;
10943 case ScriptBaseClass.OBJECT_POS: 11606 case ScriptBaseClass.OBJECT_POS:
10944 ret.Add(new LSL_Vector((double)av.AbsolutePosition.X, (double)av.AbsolutePosition.Y, (double)av.AbsolutePosition.Z)); 11607 Vector3 avpos;
11608
11609 if (av.ParentID != 0 && av.ParentPart != null)
11610 {
11611 avpos = av.OffsetPosition;
11612
11613 Vector3 sitOffset = (Zrot(av.Rotation)) * (av.Appearance.AvatarHeight * 0.02638f *2.0f);
11614 avpos -= sitOffset;
11615
11616 avpos = av.ParentPart.GetWorldPosition() + avpos * av.ParentPart.GetWorldRotation();
11617 }
11618 else
11619 avpos = av.AbsolutePosition;
11620
11621 ret.Add(new LSL_Vector((double)avpos.X, (double)avpos.Y, (double)avpos.Z));
10945 break; 11622 break;
10946 case ScriptBaseClass.OBJECT_ROT: 11623 case ScriptBaseClass.OBJECT_ROT:
10947 ret.Add(new LSL_Rotation(av.GetWorldRotation())); 11624 Quaternion avrot = av.Rotation;
11625 if (av.ParentID != 0 && av.ParentPart != null)
11626 {
11627 avrot = av.ParentPart.GetWorldRotation() * avrot;
11628 }
11629 ret.Add(new LSL_Rotation((double)avrot.X, (double)avrot.Y, (double)avrot.Z, (double)avrot.W));
10948 break; 11630 break;
10949 case ScriptBaseClass.OBJECT_VELOCITY: 11631 case ScriptBaseClass.OBJECT_VELOCITY:
10950 ret.Add(new LSL_Vector(av.Velocity.X, av.Velocity.Y, av.Velocity.Z)); 11632 Vector3 avvel = av.Velocity;
11633 ret.Add(new LSL_Vector((double)avvel.X, (double)avvel.Y, (double)avvel.Z));
10951 break; 11634 break;
10952 case ScriptBaseClass.OBJECT_OWNER: 11635 case ScriptBaseClass.OBJECT_OWNER:
10953 ret.Add(new LSL_String(id)); 11636 ret.Add(new LSL_String(id));
@@ -11032,11 +11715,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11032 case ScriptBaseClass.OBJECT_NAME: 11715 case ScriptBaseClass.OBJECT_NAME:
11033 ret.Add(new LSL_String(obj.Name)); 11716 ret.Add(new LSL_String(obj.Name));
11034 break; 11717 break;
11035 case ScriptBaseClass.OBJECT_DESC: 11718 case ScriptBaseClass.OBJECT_DESC:
11036 ret.Add(new LSL_String(obj.Description)); 11719 ret.Add(new LSL_String(obj.Description));
11037 break; 11720 break;
11038 case ScriptBaseClass.OBJECT_POS: 11721 case ScriptBaseClass.OBJECT_POS:
11039 ret.Add(new LSL_Vector(obj.AbsolutePosition.X, obj.AbsolutePosition.Y, obj.AbsolutePosition.Z)); 11722 Vector3 opos = obj.AbsolutePosition;
11723 ret.Add(new LSL_Vector(opos.X, opos.Y, opos.Z));
11040 break; 11724 break;
11041 case ScriptBaseClass.OBJECT_ROT: 11725 case ScriptBaseClass.OBJECT_ROT:
11042 { 11726 {
@@ -11086,9 +11770,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11086 // The value returned in SL for normal prims is prim count 11770 // The value returned in SL for normal prims is prim count
11087 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); 11771 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
11088 break; 11772 break;
11089 // The following 3 costs I have intentionaly coded to return zero. They are part of 11773
11090 // "Land Impact" calculations. These calculations are probably not applicable 11774 // costs below may need to be diferent for root parts, need to check
11091 // to OpenSim and are not yet complete in SL
11092 case ScriptBaseClass.OBJECT_SERVER_COST: 11775 case ScriptBaseClass.OBJECT_SERVER_COST:
11093 // The linden calculation is here 11776 // The linden calculation is here
11094 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight 11777 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
@@ -11096,16 +11779,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11096 ret.Add(new LSL_Float(0)); 11779 ret.Add(new LSL_Float(0));
11097 break; 11780 break;
11098 case ScriptBaseClass.OBJECT_STREAMING_COST: 11781 case ScriptBaseClass.OBJECT_STREAMING_COST:
11099 // The linden calculation is here 11782 // The value returned in SL for normal prims is prim count * 0.06
11100 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost 11783 ret.Add(new LSL_Float(obj.StreamingCost));
11101 // The value returned in SL for normal prims looks like the prim count * 0.06
11102 ret.Add(new LSL_Float(0));
11103 break; 11784 break;
11104 case ScriptBaseClass.OBJECT_PHYSICS_COST: 11785 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11105 // The linden calculation is here 11786 // The value returned in SL for normal prims is prim count
11106 // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics 11787 ret.Add(new LSL_Float(obj.PhysicsCost));
11107 // The value returned in SL for normal prims looks like the prim count
11108 ret.Add(new LSL_Float(0));
11109 break; 11788 break;
11110 case ScriptBaseClass.OBJECT_CHARACTER_TIME: // Pathfinding 11789 case ScriptBaseClass.OBJECT_CHARACTER_TIME: // Pathfinding
11111 ret.Add(new LSL_Float(0)); 11790 ret.Add(new LSL_Float(0));
@@ -11364,15 +12043,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11364 return result; 12043 return result;
11365 } 12044 }
11366 12045
11367 public void print(string str) 12046 public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
11368 { 12047 {
11369 // yes, this is a real LSL function. See: http://wiki.secondlife.com/wiki/Print 12048 List<SceneObjectPart> parts = GetLinkParts(link);
11370 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL"); 12049 if (parts.Count < 1)
11371 if (ossl != null) 12050 return 0;
11372 { 12051
11373 ossl.CheckThreatLevel(ThreatLevel.High, "print"); 12052 return GetNumberOfSides(parts[0]);
11374 m_log.Info("LSL print():" + str);
11375 }
11376 } 12053 }
11377 12054
11378 private string Name2Username(string name) 12055 private string Name2Username(string name)
@@ -11417,7 +12094,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11417 12094
11418 return rq.ToString(); 12095 return rq.ToString();
11419 } 12096 }
11420 12097/*
12098 private void SayShoutTimerElapsed(Object sender, ElapsedEventArgs args)
12099 {
12100 m_SayShoutCount = 0;
12101 }
12102*/
11421 private struct Tri 12103 private struct Tri
11422 { 12104 {
11423 public Vector3 p1; 12105 public Vector3 p1;
@@ -11566,9 +12248,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11566 12248
11567 ContactResult result = new ContactResult (); 12249 ContactResult result = new ContactResult ();
11568 result.ConsumerID = group.LocalId; 12250 result.ConsumerID = group.LocalId;
11569 result.Depth = intersection.distance; 12251// result.Depth = intersection.distance;
11570 result.Normal = intersection.normal; 12252 result.Normal = intersection.normal;
11571 result.Pos = intersection.ipoint; 12253 result.Pos = intersection.ipoint;
12254 result.Depth = Vector3.Mag(rayStart - result.Pos);
11572 12255
11573 contacts.Add(result); 12256 contacts.Add(result);
11574 }); 12257 });
@@ -11701,6 +12384,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11701 12384
11702 return contacts[0]; 12385 return contacts[0];
11703 } 12386 }
12387/*
12388 // not done:
12389 private ContactResult[] testRay2NonPhysicalPhantom(Vector3 rayStart, Vector3 raydir, float raylenght)
12390 {
12391 ContactResult[] contacts = null;
12392 World.ForEachSOG(delegate(SceneObjectGroup group)
12393 {
12394 if (m_host.ParentGroup == group)
12395 return;
12396
12397 if (group.IsAttachment)
12398 return;
12399
12400 if(group.RootPart.PhysActor != null)
12401 return;
12402
12403 contacts = group.RayCastGroupPartsOBBNonPhysicalPhantom(rayStart, raydir, raylenght);
12404 });
12405 return contacts;
12406 }
12407*/
11704 12408
11705 public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options) 12409 public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options)
11706 { 12410 {
@@ -11824,18 +12528,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11824 } 12528 }
11825 } 12529 }
11826 12530
12531 // Double check this
11827 if (checkTerrain) 12532 if (checkTerrain)
11828 { 12533 {
11829 ContactResult? groundContact = GroundIntersection(rayStart, rayEnd); 12534 bool skipGroundCheck = false;
11830 if (groundContact != null) 12535
11831 results.Add((ContactResult)groundContact); 12536 foreach (ContactResult c in results)
12537 {
12538 if (c.ConsumerID == 0) // Physics gave us a ground collision
12539 skipGroundCheck = true;
12540 }
12541
12542 if (!skipGroundCheck)
12543 {
12544 ContactResult? groundContact = GroundIntersection(rayStart, rayEnd);
12545 if (groundContact != null)
12546 results.Add((ContactResult)groundContact);
12547 }
11832 } 12548 }
11833 12549
11834 results.Sort(delegate(ContactResult a, ContactResult b) 12550 results.Sort(delegate(ContactResult a, ContactResult b)
11835 { 12551 {
11836 return a.Depth.CompareTo(b.Depth); 12552 return a.Depth.CompareTo(b.Depth);
11837 }); 12553 });
11838 12554
11839 int values = 0; 12555 int values = 0;
11840 SceneObjectGroup thisgrp = m_host.ParentGroup; 12556 SceneObjectGroup thisgrp = m_host.ParentGroup;
11841 12557
@@ -11928,7 +12644,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11928 case ScriptBaseClass.ESTATE_ACCESS_ALLOWED_AGENT_ADD: 12644 case ScriptBaseClass.ESTATE_ACCESS_ALLOWED_AGENT_ADD:
11929 if (!isAccount) return 0; 12645 if (!isAccount) return 0;
11930 if (estate.HasAccess(id)) return 1; 12646 if (estate.HasAccess(id)) return 1;
11931 if (estate.IsBanned(id)) 12647 if (estate.IsBanned(id, World.GetUserFlags(id)))
11932 estate.RemoveBan(id); 12648 estate.RemoveBan(id);
11933 estate.AddEstateUser(id); 12649 estate.AddEstateUser(id);
11934 break; 12650 break;
@@ -11947,14 +12663,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11947 break; 12663 break;
11948 case ScriptBaseClass.ESTATE_ACCESS_BANNED_AGENT_ADD: 12664 case ScriptBaseClass.ESTATE_ACCESS_BANNED_AGENT_ADD:
11949 if (!isAccount) return 0; 12665 if (!isAccount) return 0;
11950 if (estate.IsBanned(id)) return 1; 12666 if (estate.IsBanned(id, World.GetUserFlags(id))) return 1;
11951 EstateBan ban = new EstateBan(); 12667 EstateBan ban = new EstateBan();
11952 ban.EstateID = estate.EstateID; 12668 ban.EstateID = estate.EstateID;
11953 ban.BannedUserID = id; 12669 ban.BannedUserID = id;
11954 estate.AddBan(ban); 12670 estate.AddBan(ban);
11955 break; 12671 break;
11956 case ScriptBaseClass.ESTATE_ACCESS_BANNED_AGENT_REMOVE: 12672 case ScriptBaseClass.ESTATE_ACCESS_BANNED_AGENT_REMOVE:
11957 if (!isAccount || !estate.IsBanned(id)) return 0; 12673 if (!isAccount || !estate.IsBanned(id, World.GetUserFlags(id))) return 0;
11958 estate.RemoveBan(id); 12674 estate.RemoveBan(id);
11959 break; 12675 break;
11960 default: return 0; 12676 default: return 0;
@@ -12019,13 +12735,63 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12019 public void llCollisionSprite(string impact_sprite) 12735 public void llCollisionSprite(string impact_sprite)
12020 { 12736 {
12021 m_host.AddScriptLPS(1); 12737 m_host.AddScriptLPS(1);
12022 NotImplemented("llCollisionSprite"); 12738 // Viewer 2.0 broke this and it's likely LL has no intention
12739 // of fixing it. Therefore, letting this be a NOP seems appropriate.
12023 } 12740 }
12024 12741
12025 public void llGodLikeRezObject(string inventory, LSL_Vector pos) 12742 public void llGodLikeRezObject(string inventory, LSL_Vector pos)
12026 { 12743 {
12027 m_host.AddScriptLPS(1); 12744 m_host.AddScriptLPS(1);
12028 NotImplemented("llGodLikeRezObject"); 12745
12746 if (!World.Permissions.IsGod(m_host.OwnerID))
12747 NotImplemented("llGodLikeRezObject");
12748
12749 AssetBase rezAsset = World.AssetService.Get(inventory);
12750 if (rezAsset == null)
12751 {
12752 llSay(0, "Asset not found");
12753 return;
12754 }
12755
12756 SceneObjectGroup group = null;
12757
12758 try
12759 {
12760 string xmlData = Utils.BytesToString(rezAsset.Data);
12761 group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
12762 }
12763 catch
12764 {
12765 llSay(0, "Asset not found");
12766 return;
12767 }
12768
12769 if (group == null)
12770 {
12771 llSay(0, "Asset not found");
12772 return;
12773 }
12774
12775 group.RootPart.AttachPoint = group.RootPart.Shape.State;
12776 group.RootPart.AttachOffset = group.AbsolutePosition;
12777
12778 group.ResetIDs();
12779
12780 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
12781 World.AddNewSceneObject(group, true, llpos, Quaternion.Identity, Vector3.Zero);
12782 group.CreateScriptInstances(0, true, World.DefaultScriptEngine, 3);
12783 group.ScheduleGroupForFullUpdate();
12784
12785 // objects rezzed with this method are die_at_edge by default.
12786 group.RootPart.SetDieAtEdge(true);
12787
12788 group.ResumeScripts();
12789
12790 m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams(
12791 "object_rez", new Object[] {
12792 new LSL_String(
12793 group.RootPart.UUID.ToString()) },
12794 new DetectParams[0]));
12029 } 12795 }
12030 12796
12031 public LSL_String llTransferLindenDollars(string destination, int amount) 12797 public LSL_String llTransferLindenDollars(string destination, int amount)
@@ -12076,8 +12842,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12076 return; 12842 return;
12077 } 12843 }
12078 12844
12845 string reason;
12079 bool result = money.ObjectGiveMoney( 12846 bool result = money.ObjectGiveMoney(
12080 m_host.ParentGroup.RootPart.UUID, m_host.ParentGroup.RootPart.OwnerID, toID, amount); 12847 m_host.ParentGroup.RootPart.UUID, m_host.ParentGroup.RootPart.OwnerID, toID, amount, txn, out reason);
12081 12848
12082 if (result) 12849 if (result)
12083 { 12850 {
@@ -12085,7 +12852,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12085 return; 12852 return;
12086 } 12853 }
12087 12854
12088 replydata = "LINDENDOLLAR_INSUFFICIENTFUNDS"; 12855 replydata = reason;
12089 } 12856 }
12090 finally 12857 finally
12091 { 12858 {
@@ -12102,6 +12869,610 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12102 } 12869 }
12103 12870
12104 #endregion 12871 #endregion
12872
12873 public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
12874 {
12875 SceneObjectGroup group = m_host.ParentGroup;
12876
12877 if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
12878 return;
12879 if (group.IsAttachment)
12880 return;
12881
12882 if (frames.Data.Length > 0) // We are getting a new motion
12883 {
12884 if (group.RootPart.KeyframeMotion != null)
12885 group.RootPart.KeyframeMotion.Delete();
12886 group.RootPart.KeyframeMotion = null;
12887
12888 int idx = 0;
12889
12890 KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
12891 KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
12892
12893 while (idx < options.Data.Length)
12894 {
12895 int option = (int)options.GetLSLIntegerItem(idx++);
12896 int remain = options.Data.Length - idx;
12897
12898 switch (option)
12899 {
12900 case ScriptBaseClass.KFM_MODE:
12901 if (remain < 1)
12902 break;
12903 int modeval = (int)options.GetLSLIntegerItem(idx++);
12904 switch(modeval)
12905 {
12906 case ScriptBaseClass.KFM_FORWARD:
12907 mode = KeyframeMotion.PlayMode.Forward;
12908 break;
12909 case ScriptBaseClass.KFM_REVERSE:
12910 mode = KeyframeMotion.PlayMode.Reverse;
12911 break;
12912 case ScriptBaseClass.KFM_LOOP:
12913 mode = KeyframeMotion.PlayMode.Loop;
12914 break;
12915 case ScriptBaseClass.KFM_PING_PONG:
12916 mode = KeyframeMotion.PlayMode.PingPong;
12917 break;
12918 }
12919 break;
12920 case ScriptBaseClass.KFM_DATA:
12921 if (remain < 1)
12922 break;
12923 int dataval = (int)options.GetLSLIntegerItem(idx++);
12924 data = (KeyframeMotion.DataFormat)dataval;
12925 break;
12926 }
12927 }
12928
12929 group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
12930
12931 idx = 0;
12932
12933 int elemLength = 2;
12934 if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation))
12935 elemLength = 3;
12936
12937 List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>();
12938 while (idx < frames.Data.Length)
12939 {
12940 int remain = frames.Data.Length - idx;
12941
12942 if (remain < elemLength)
12943 break;
12944
12945 KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe();
12946 frame.Position = null;
12947 frame.Rotation = null;
12948
12949 if ((data & KeyframeMotion.DataFormat.Translation) != 0)
12950 {
12951 LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++);
12952 frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z);
12953 }
12954 if ((data & KeyframeMotion.DataFormat.Rotation) != 0)
12955 {
12956 LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
12957 Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
12958 q.Normalize();
12959 frame.Rotation = q;
12960 }
12961
12962 float tempf = (float)frames.GetLSLFloatItem(idx++);
12963 frame.TimeMS = (int)(tempf * 1000.0f);
12964
12965 keyframes.Add(frame);
12966 }
12967
12968 group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
12969 group.RootPart.KeyframeMotion.Start();
12970 }
12971 else
12972 {
12973 if (group.RootPart.KeyframeMotion == null)
12974 return;
12975
12976 if (options.Data.Length == 0)
12977 {
12978 group.RootPart.KeyframeMotion.Stop();
12979 return;
12980 }
12981
12982 int code = (int)options.GetLSLIntegerItem(0);
12983
12984 int idx = 0;
12985
12986 while (idx < options.Data.Length)
12987 {
12988 int option = (int)options.GetLSLIntegerItem(idx++);
12989 int remain = options.Data.Length - idx;
12990
12991 switch (option)
12992 {
12993 case ScriptBaseClass.KFM_COMMAND:
12994 int cmd = (int)options.GetLSLIntegerItem(idx++);
12995 switch (cmd)
12996 {
12997 case ScriptBaseClass.KFM_CMD_PLAY:
12998 group.RootPart.KeyframeMotion.Start();
12999 break;
13000 case ScriptBaseClass.KFM_CMD_STOP:
13001 group.RootPart.KeyframeMotion.Stop();
13002 break;
13003 case ScriptBaseClass.KFM_CMD_PAUSE:
13004 group.RootPart.KeyframeMotion.Pause();
13005 break;
13006 }
13007 break;
13008 }
13009 }
13010 }
13011 }
13012
13013 protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed)
13014 {
13015 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset.
13016
13017 int idx = 0;
13018 int idxStart = 0;
13019
13020 bool positionChanged = false;
13021 Vector3 finalPos = Vector3.Zero;
13022
13023 try
13024 {
13025 while (idx < rules.Length)
13026 {
13027 ++rulesParsed;
13028 int code = rules.GetLSLIntegerItem(idx++);
13029
13030 int remain = rules.Length - idx;
13031 idxStart = idx;
13032
13033 switch (code)
13034 {
13035 case (int)ScriptBaseClass.PRIM_POSITION:
13036 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
13037 {
13038 if (remain < 1)
13039 return null;
13040
13041 LSL_Vector v;
13042 v = rules.GetVector3Item(idx++);
13043
13044 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
13045 if (part == null)
13046 break;
13047
13048 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
13049 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
13050 if (part.LinkNum > 1)
13051 {
13052 localRot = GetPartLocalRot(part);
13053 localPos = GetPartLocalPos(part);
13054 }
13055
13056 v -= localPos;
13057 v /= localRot;
13058
13059 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f);
13060
13061 v = v + 2 * sitOffset;
13062
13063 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
13064 av.SendAvatarDataToAllAgents();
13065
13066 }
13067 break;
13068
13069 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
13070 case (int)ScriptBaseClass.PRIM_ROTATION:
13071 {
13072 if (remain < 1)
13073 return null;
13074
13075 LSL_Rotation r;
13076 r = rules.GetQuaternionItem(idx++);
13077
13078 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
13079 if (part == null)
13080 break;
13081
13082 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
13083 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
13084
13085 if (part.LinkNum > 1)
13086 localRot = GetPartLocalRot(part);
13087
13088 r = r * llGetRootRotation() / localRot;
13089 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
13090 av.SendAvatarDataToAllAgents();
13091 }
13092 break;
13093
13094 // parse rest doing nothing but number of parameters error check
13095 case (int)ScriptBaseClass.PRIM_SIZE:
13096 case (int)ScriptBaseClass.PRIM_MATERIAL:
13097 case (int)ScriptBaseClass.PRIM_PHANTOM:
13098 case (int)ScriptBaseClass.PRIM_PHYSICS:
13099 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
13100 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
13101 case (int)ScriptBaseClass.PRIM_NAME:
13102 case (int)ScriptBaseClass.PRIM_DESC:
13103 if (remain < 1)
13104 return null;
13105 idx++;
13106 break;
13107
13108 case (int)ScriptBaseClass.PRIM_GLOW:
13109 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
13110 case (int)ScriptBaseClass.PRIM_TEXGEN:
13111 if (remain < 2)
13112 return null;
13113 idx += 2;
13114 break;
13115
13116 case (int)ScriptBaseClass.PRIM_TYPE:
13117 if (remain < 3)
13118 return null;
13119 code = (int)rules.GetLSLIntegerItem(idx++);
13120 remain = rules.Length - idx;
13121 switch (code)
13122 {
13123 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
13124 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
13125 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
13126 if (remain < 6)
13127 return null;
13128 idx += 6;
13129 break;
13130
13131 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
13132 if (remain < 5)
13133 return null;
13134 idx += 5;
13135 break;
13136
13137 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
13138 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
13139 case (int)ScriptBaseClass.PRIM_TYPE_RING:
13140 if (remain < 11)
13141 return null;
13142 idx += 11;
13143 break;
13144
13145 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
13146 if (remain < 2)
13147 return null;
13148 idx += 2;
13149 break;
13150 }
13151 break;
13152
13153 case (int)ScriptBaseClass.PRIM_COLOR:
13154 case (int)ScriptBaseClass.PRIM_TEXT:
13155 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
13156 case (int)ScriptBaseClass.PRIM_OMEGA:
13157 if (remain < 3)
13158 return null;
13159 idx += 3;
13160 break;
13161
13162 case (int)ScriptBaseClass.PRIM_TEXTURE:
13163 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
13164 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
13165 if (remain < 5)
13166 return null;
13167 idx += 5;
13168 break;
13169
13170 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
13171 if (remain < 7)
13172 return null;
13173
13174 idx += 7;
13175 break;
13176
13177 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
13178 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
13179 return null;
13180
13181 return rules.GetSublist(idx, -1);
13182 }
13183 }
13184 }
13185 catch (InvalidCastException e)
13186 {
13187 ShoutError(string.Format(
13188 "{0} error running rule #{1}: arg #{2} ",
13189 originFunc, rulesParsed, idx - idxStart) + e.Message);
13190 }
13191 finally
13192 {
13193 if (positionChanged)
13194 {
13195 av.OffsetPosition = finalPos;
13196// av.SendAvatarDataToAllAgents();
13197 av.SendTerseUpdateToAllClients();
13198 positionChanged = false;
13199 }
13200 }
13201 return null;
13202 }
13203
13204 public LSL_List GetPrimParams(ScenePresence avatar, LSL_List rules, ref LSL_List res)
13205 {
13206 // avatars case
13207 // replies as SL wiki
13208
13209// SceneObjectPart sitPart = avatar.ParentPart; // most likelly it will be needed
13210 SceneObjectPart sitPart = World.GetSceneObjectPart(avatar.ParentID); // maybe better do this expensive search for it in case it's gone??
13211
13212 int idx = 0;
13213 while (idx < rules.Length)
13214 {
13215 int code = (int)rules.GetLSLIntegerItem(idx++);
13216 int remain = rules.Length - idx;
13217
13218 switch (code)
13219 {
13220 case (int)ScriptBaseClass.PRIM_MATERIAL:
13221 res.Add(new LSL_Integer((int)SOPMaterialData.SopMaterial.Flesh));
13222 break;
13223
13224 case (int)ScriptBaseClass.PRIM_PHYSICS:
13225 res.Add(new LSL_Integer(0));
13226 break;
13227
13228 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
13229 res.Add(new LSL_Integer(0));
13230 break;
13231
13232 case (int)ScriptBaseClass.PRIM_PHANTOM:
13233 res.Add(new LSL_Integer(0));
13234 break;
13235
13236 case (int)ScriptBaseClass.PRIM_POSITION:
13237
13238 Vector3 pos = avatar.OffsetPosition;
13239
13240 Vector3 sitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f *2.0f);
13241 pos -= sitOffset;
13242
13243 if( sitPart != null)
13244 pos = sitPart.GetWorldPosition() + pos * sitPart.GetWorldRotation();
13245
13246 res.Add(new LSL_Vector(pos.X,pos.Y,pos.Z));
13247 break;
13248
13249 case (int)ScriptBaseClass.PRIM_SIZE:
13250 // as in llGetAgentSize above
13251// res.Add(new LSL_Vector(0.45f, 0.6f, avatar.Appearance.AvatarHeight));
13252 Vector3 s = avatar.Appearance.AvatarSize;
13253 res.Add(new LSL_Vector(s.X, s.Y, s.Z));
13254
13255 break;
13256
13257 case (int)ScriptBaseClass.PRIM_ROTATION:
13258 Quaternion rot = avatar.Rotation;
13259 if (sitPart != null)
13260 {
13261 rot = sitPart.GetWorldRotation() * rot; // apply sit part world rotation
13262 }
13263
13264 res.Add(new LSL_Rotation (rot.X, rot.Y, rot.Z, rot.W));
13265 break;
13266
13267 case (int)ScriptBaseClass.PRIM_TYPE:
13268 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX));
13269 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT));
13270 res.Add(new LSL_Vector(0f,1.0f,0f));
13271 res.Add(new LSL_Float(0.0f));
13272 res.Add(new LSL_Vector(0, 0, 0));
13273 res.Add(new LSL_Vector(1.0f,1.0f,0f));
13274 res.Add(new LSL_Vector(0, 0, 0));
13275 break;
13276
13277 case (int)ScriptBaseClass.PRIM_TEXTURE:
13278 if (remain < 1)
13279 return null;
13280
13281 int face = (int)rules.GetLSLIntegerItem(idx++);
13282 if (face == ScriptBaseClass.ALL_SIDES)
13283 {
13284 for (face = 0; face < 21; face++)
13285 {
13286 res.Add(new LSL_String(""));
13287 res.Add(new LSL_Vector(0,0,0));
13288 res.Add(new LSL_Vector(0,0,0));
13289 res.Add(new LSL_Float(0.0));
13290 }
13291 }
13292 else
13293 {
13294 if (face >= 0 && face < 21)
13295 {
13296 res.Add(new LSL_String(""));
13297 res.Add(new LSL_Vector(0,0,0));
13298 res.Add(new LSL_Vector(0,0,0));
13299 res.Add(new LSL_Float(0.0));
13300 }
13301 }
13302 break;
13303
13304 case (int)ScriptBaseClass.PRIM_COLOR:
13305 if (remain < 1)
13306 return null;
13307
13308 face = (int)rules.GetLSLIntegerItem(idx++);
13309
13310 if (face == ScriptBaseClass.ALL_SIDES)
13311 {
13312 for (face = 0; face < 21; face++)
13313 {
13314 res.Add(new LSL_Vector(0,0,0));
13315 res.Add(new LSL_Float(0));
13316 }
13317 }
13318 else
13319 {
13320 res.Add(new LSL_Vector(0,0,0));
13321 res.Add(new LSL_Float(0));
13322 }
13323 break;
13324
13325 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
13326 if (remain < 1)
13327 return null;
13328 face = (int)rules.GetLSLIntegerItem(idx++);
13329
13330 if (face == ScriptBaseClass.ALL_SIDES)
13331 {
13332 for (face = 0; face < 21; face++)
13333 {
13334 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
13335 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
13336 }
13337 }
13338 else
13339 {
13340 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
13341 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
13342 }
13343 break;
13344
13345 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
13346 if (remain < 1)
13347 return null;
13348 face = (int)rules.GetLSLIntegerItem(idx++);
13349
13350 if (face == ScriptBaseClass.ALL_SIDES)
13351 {
13352 for (face = 0; face < 21; face++)
13353 {
13354 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
13355 }
13356 }
13357 else
13358 {
13359 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
13360 }
13361 break;
13362
13363 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
13364 res.Add(new LSL_Integer(0));
13365 res.Add(new LSL_Integer(0));// softness
13366 res.Add(new LSL_Float(0.0f)); // gravity
13367 res.Add(new LSL_Float(0.0f)); // friction
13368 res.Add(new LSL_Float(0.0f)); // wind
13369 res.Add(new LSL_Float(0.0f)); // tension
13370 res.Add(new LSL_Vector(0f,0f,0f));
13371 break;
13372
13373 case (int)ScriptBaseClass.PRIM_TEXGEN:
13374 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
13375 if (remain < 1)
13376 return null;
13377 face = (int)rules.GetLSLIntegerItem(idx++);
13378
13379 if (face == ScriptBaseClass.ALL_SIDES)
13380 {
13381 for (face = 0; face < 21; face++)
13382 {
13383 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
13384 }
13385 }
13386 else
13387 {
13388 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
13389 }
13390 break;
13391
13392 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
13393 res.Add(new LSL_Integer(0));
13394 res.Add(new LSL_Vector(0f,0f,0f));
13395 res.Add(new LSL_Float(0f)); // intensity
13396 res.Add(new LSL_Float(0f)); // radius
13397 res.Add(new LSL_Float(0f)); // falloff
13398 break;
13399
13400 case (int)ScriptBaseClass.PRIM_GLOW:
13401 if (remain < 1)
13402 return null;
13403 face = (int)rules.GetLSLIntegerItem(idx++);
13404
13405 if (face == ScriptBaseClass.ALL_SIDES)
13406 {
13407 for (face = 0; face < 21; face++)
13408 {
13409 res.Add(new LSL_Float(0f));
13410 }
13411 }
13412 else
13413 {
13414 res.Add(new LSL_Float(0f));
13415 }
13416 break;
13417
13418 case (int)ScriptBaseClass.PRIM_TEXT:
13419 res.Add(new LSL_String(""));
13420 res.Add(new LSL_Vector(0f,0f,0f));
13421 res.Add(new LSL_Float(1.0f));
13422 break;
13423
13424 case (int)ScriptBaseClass.PRIM_NAME:
13425 res.Add(new LSL_String(avatar.Name));
13426 break;
13427
13428 case (int)ScriptBaseClass.PRIM_DESC:
13429 res.Add(new LSL_String(""));
13430 break;
13431
13432 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
13433 Quaternion lrot = avatar.Rotation;
13434
13435 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
13436 {
13437 lrot = sitPart.RotationOffset * lrot; // apply sit part rotation offset
13438 }
13439 res.Add(new LSL_Rotation(lrot.X, lrot.Y, lrot.Z, lrot.W));
13440 break;
13441
13442 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
13443 Vector3 lpos = avatar.OffsetPosition; // pos relative to sit part
13444 Vector3 lsitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f * 2.0f);
13445 lpos -= lsitOffset;
13446
13447 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
13448 {
13449 lpos = sitPart.OffsetPosition + (lpos * sitPart.RotationOffset); // make it relative to root prim
13450 }
13451 res.Add(new LSL_Vector(lpos.X,lpos.Y,lpos.Z));
13452 break;
13453
13454 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
13455 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
13456 return null;
13457
13458 return rules.GetSublist(idx, -1);
13459 }
13460 }
13461
13462 return null;
13463 }
13464
13465 public void llSetContentType(LSL_Key id, LSL_Integer content_type)
13466 {
13467 if (m_UrlModule != null)
13468 {
13469 string type = "text.plain";
13470 if (content_type == (int)ScriptBaseClass.CONTENT_TYPE_HTML)
13471 type = "text/html";
13472
13473 m_UrlModule.HttpContentType(new UUID(id),type);
13474 }
13475 }
12105 } 13476 }
12106 13477
12107 public class NotecardCache 13478 public class NotecardCache
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 21bae27..bd776b6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -136,7 +136,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
136// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType); 136// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
137 137
138 Type returntype = m_comms.LookupReturnType(fname); 138 Type returntype = m_comms.LookupReturnType(fname);
139 if (returntype != typeof(string)) 139 if (returntype != typeof(void))
140 MODError(String.Format("return type mismatch for {0}",fname)); 140 MODError(String.Format("return type mismatch for {0}",fname));
141 141
142 modInvoke(fname,parms); 142 modInvoke(fname,parms);
@@ -329,6 +329,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
329 if (result != null) 329 if (result != null)
330 return result; 330 return result;
331 331
332 Type returntype = m_comms.LookupReturnType(fname);
333 if (returntype == typeof(void))
334 return null;
335
332 MODError(String.Format("Invocation of {0} failed; null return value",fname)); 336 MODError(String.Format("Invocation of {0} failed; null return value",fname));
333 } 337 }
334 catch (Exception e) 338 catch (Exception e)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 415166a..f4e4f44 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -139,6 +139,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
139 internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; 139 internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow;
140 internal float m_ScriptDelayFactor = 1.0f; 140 internal float m_ScriptDelayFactor = 1.0f;
141 internal float m_ScriptDistanceFactor = 1.0f; 141 internal float m_ScriptDistanceFactor = 1.0f;
142 internal bool m_debuggerSafe = false;
142 internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); 143 internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >();
143 144
144 protected IUrlModule m_UrlModule = null; 145 protected IUrlModule m_UrlModule = null;
@@ -149,6 +150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
149 m_ScriptEngine = scriptEngine; 150 m_ScriptEngine = scriptEngine;
150 m_host = host; 151 m_host = host;
151 m_item = item; 152 m_item = item;
153 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
152 154
153 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 155 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
154 156
@@ -212,7 +214,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
212 214
213 internal void OSSLError(string msg) 215 internal void OSSLError(string msg)
214 { 216 {
215 throw new ScriptException("OSSL Runtime Error: " + msg); 217 if (m_debuggerSafe)
218 {
219 OSSLShoutError(msg);
220 }
221 else
222 {
223 throw new ScriptException("OSSL Runtime Error: " + msg);
224 }
216 } 225 }
217 226
218 /// <summary> 227 /// <summary>
@@ -931,18 +940,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
931 if (target != null) 940 if (target != null)
932 { 941 {
933 UUID animID=UUID.Zero; 942 UUID animID=UUID.Zero;
934 lock (m_host.TaskInventory) 943 m_host.TaskInventory.LockItemsForRead(true);
944 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
935 { 945 {
936 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 946 if (inv.Value.Name == animation)
937 { 947 {
938 if (inv.Value.Name == animation) 948 if (inv.Value.Type == (int)AssetType.Animation)
939 { 949 animID = inv.Value.AssetID;
940 if (inv.Value.Type == (int)AssetType.Animation) 950 continue;
941 animID = inv.Value.AssetID;
942 continue;
943 }
944 } 951 }
945 } 952 }
953 m_host.TaskInventory.LockItemsForRead(false);
946 if (animID == UUID.Zero) 954 if (animID == UUID.Zero)
947 target.Animator.AddAnimation(animation, m_host.UUID); 955 target.Animator.AddAnimation(animation, m_host.UUID);
948 else 956 else
@@ -983,6 +991,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
983 else 991 else
984 animID = UUID.Zero; 992 animID = UUID.Zero;
985 } 993 }
994 m_host.TaskInventory.LockItemsForRead(false);
986 995
987 if (animID == UUID.Zero) 996 if (animID == UUID.Zero)
988 target.Animator.RemoveAnimation(animation); 997 target.Animator.RemoveAnimation(animation);
@@ -1645,7 +1654,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1645 } 1654 }
1646 } 1655 }
1647 1656
1648 public Object osParseJSONNew(string JSON) 1657 private Object osParseJSONNew(string JSON)
1649 { 1658 {
1650 CheckThreatLevel(ThreatLevel.None, "osParseJSONNew"); 1659 CheckThreatLevel(ThreatLevel.None, "osParseJSONNew");
1651 1660
@@ -1847,15 +1856,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1847 { 1856 {
1848 UUID assetID = UUID.Zero; 1857 UUID assetID = UUID.Zero;
1849 1858
1850 if (!UUID.TryParse(notecardNameOrUuid, out assetID)) 1859 bool notecardNameIsUUID = UUID.TryParse(notecardNameOrUuid, out assetID);
1860
1861 if (!notecardNameIsUUID)
1851 { 1862 {
1852 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1863 assetID = SearchTaskInventoryForAssetId(notecardNameOrUuid);
1853 {
1854 if (item.Type == 7 && item.Name == notecardNameOrUuid)
1855 {
1856 assetID = item.AssetID;
1857 }
1858 }
1859 } 1864 }
1860 1865
1861 if (assetID == UUID.Zero) 1866 if (assetID == UUID.Zero)
@@ -1866,7 +1871,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1866 AssetBase a = World.AssetService.Get(assetID.ToString()); 1871 AssetBase a = World.AssetService.Get(assetID.ToString());
1867 1872
1868 if (a == null) 1873 if (a == null)
1869 return UUID.Zero; 1874 {
1875 // Whoops, it's still possible here that the notecard name was properly
1876 // formatted like a UUID but isn't an asset UUID so lets look it up by name after all
1877 assetID = SearchTaskInventoryForAssetId(notecardNameOrUuid);
1878 if (assetID == UUID.Zero)
1879 return UUID.Zero;
1880
1881 if (!NotecardCache.IsCached(assetID))
1882 {
1883 a = World.AssetService.Get(assetID.ToString());
1884
1885 if (a == null)
1886 {
1887 return UUID.Zero;
1888 }
1889 }
1890 }
1870 1891
1871 string data = Encoding.UTF8.GetString(a.Data); 1892 string data = Encoding.UTF8.GetString(a.Data);
1872 NotecardCache.Cache(assetID, data); 1893 NotecardCache.Cache(assetID, data);
@@ -1874,6 +1895,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1874 1895
1875 return assetID; 1896 return assetID;
1876 } 1897 }
1898 protected UUID SearchTaskInventoryForAssetId(string name)
1899 {
1900 UUID assetId = UUID.Zero;
1901 m_host.TaskInventory.LockItemsForRead(true);
1902 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1903 {
1904 if (item.Type == 7 && item.Name == name)
1905 {
1906 assetId = item.AssetID;
1907 }
1908 }
1909 m_host.TaskInventory.LockItemsForRead(false);
1910 return assetId;
1911 }
1877 1912
1878 /// <summary> 1913 /// <summary>
1879 /// Directly get an entire notecard at once. 1914 /// Directly get an entire notecard at once.
@@ -2351,7 +2386,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2351 CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); 2386 CheckThreatLevel(ThreatLevel.High, "osNpcCreate");
2352 m_host.AddScriptLPS(1); 2387 m_host.AddScriptLPS(1);
2353 2388
2354 return NpcCreate(firstname, lastname, position, notecard, false, false); 2389 return NpcCreate(firstname, lastname, position, notecard, true, false);
2355 } 2390 }
2356 2391
2357 public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) 2392 public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options)
@@ -2362,24 +2397,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2362 return NpcCreate( 2397 return NpcCreate(
2363 firstname, lastname, position, notecard, 2398 firstname, lastname, position, notecard,
2364 (options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0, 2399 (options & ScriptBaseClass.OS_NPC_NOT_OWNED) == 0,
2365 (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0); 2400 false);
2401// (options & ScriptBaseClass.OS_NPC_SENSE_AS_AGENT) != 0);
2366 } 2402 }
2367 2403
2368 private LSL_Key NpcCreate( 2404 private LSL_Key NpcCreate(
2369 string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent) 2405 string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent)
2370 { 2406 {
2407 if (!owned)
2408 OSSLError("Unowned NPCs are unsupported");
2409
2410 string groupTitle = String.Empty;
2411
2412 if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z)))
2413 return new LSL_Key(UUID.Zero.ToString());
2414
2415 if (firstname != String.Empty || lastname != String.Empty)
2416 {
2417 if (firstname != "Shown outfit:")
2418 groupTitle = "- NPC -";
2419 }
2420
2371 INPCModule module = World.RequestModuleInterface<INPCModule>(); 2421 INPCModule module = World.RequestModuleInterface<INPCModule>();
2372 if (module != null) 2422 if (module != null)
2373 { 2423 {
2374 AvatarAppearance appearance = null; 2424 AvatarAppearance appearance = null;
2375 2425
2376 UUID id; 2426// UUID id;
2377 if (UUID.TryParse(notecard, out id)) 2427// if (UUID.TryParse(notecard, out id))
2378 { 2428// {
2379 ScenePresence clonePresence = World.GetScenePresence(id); 2429// ScenePresence clonePresence = World.GetScenePresence(id);
2380 if (clonePresence != null) 2430// if (clonePresence != null)
2381 appearance = clonePresence.Appearance; 2431// appearance = clonePresence.Appearance;
2382 } 2432// }
2383 2433
2384 if (appearance == null) 2434 if (appearance == null)
2385 { 2435 {
@@ -2387,9 +2437,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2387 2437
2388 if (appearanceSerialized != null) 2438 if (appearanceSerialized != null)
2389 { 2439 {
2390 OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized); 2440 try
2391 appearance = new AvatarAppearance(); 2441 {
2392 appearance.Unpack(appearanceOsd); 2442 OSDMap appearanceOsd = (OSDMap)OSDParser.DeserializeLLSDXml(appearanceSerialized);
2443 appearance = new AvatarAppearance();
2444 appearance.Unpack(appearanceOsd);
2445 }
2446 catch
2447 {
2448 return UUID.Zero.ToString();
2449 }
2393 } 2450 }
2394 else 2451 else
2395 { 2452 {
@@ -2408,6 +2465,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2408 World, 2465 World,
2409 appearance); 2466 appearance);
2410 2467
2468 ScenePresence sp;
2469 if (World.TryGetScenePresence(x, out sp))
2470 {
2471 sp.Grouptitle = groupTitle;
2472 sp.SendAvatarDataToAllAgents();
2473 }
2411 return new LSL_Key(x.ToString()); 2474 return new LSL_Key(x.ToString());
2412 } 2475 }
2413 2476
@@ -2705,16 +2768,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2705 CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); 2768 CheckThreatLevel(ThreatLevel.High, "osNpcRemove");
2706 m_host.AddScriptLPS(1); 2769 m_host.AddScriptLPS(1);
2707 2770
2708 INPCModule module = World.RequestModuleInterface<INPCModule>(); 2771 ManualResetEvent ev = new ManualResetEvent(false);
2709 if (module != null)
2710 {
2711 UUID npcId = new UUID(npc.m_string);
2712 2772
2713 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2773 Util.FireAndForget(delegate(object x) {
2714 return; 2774 try
2775 {
2776 INPCModule module = World.RequestModuleInterface<INPCModule>();
2777 if (module != null)
2778 {
2779 UUID npcId = new UUID(npc.m_string);
2715 2780
2716 module.DeleteNPC(npcId, World); 2781 ILandObject l = World.LandChannel.GetLandObject(m_host.GroupPosition.X, m_host.GroupPosition.Y);
2717 } 2782 if (l == null || m_host.OwnerID != l.LandData.OwnerID)
2783 {
2784 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2785 return;
2786 }
2787
2788 module.DeleteNPC(npcId, World);
2789 }
2790 }
2791 finally
2792 {
2793 ev.Set();
2794 }
2795 });
2796 ev.WaitOne();
2718 } 2797 }
2719 2798
2720 public void osNpcPlayAnimation(LSL_Key npc, string animation) 2799 public void osNpcPlayAnimation(LSL_Key npc, string animation)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 88ab515..a47e452 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -93,7 +93,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
93 private const int AGENT = 1; 93 private const int AGENT = 1;
94 private const int AGENT_BY_USERNAME = 0x10; 94 private const int AGENT_BY_USERNAME = 0x10;
95 private const int NPC = 0x20; 95 private const int NPC = 0x20;
96 private const int OS_NPC = 0x01000000;
97 private const int ACTIVE = 2; 96 private const int ACTIVE = 2;
98 private const int PASSIVE = 4; 97 private const int PASSIVE = 4;
99 private const int SCRIPTED = 8; 98 private const int SCRIPTED = 8;
@@ -240,7 +239,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
240 List<SensedEntity> sensedEntities = new List<SensedEntity>(); 239 List<SensedEntity> sensedEntities = new List<SensedEntity>();
241 240
242 // Is the sensor type is AGENT and not SCRIPTED then include agents 241 // Is the sensor type is AGENT and not SCRIPTED then include agents
243 if ((ts.type & (AGENT | AGENT_BY_USERNAME | NPC | OS_NPC)) != 0 && (ts.type & SCRIPTED) == 0) 242 if ((ts.type & (AGENT | AGENT_BY_USERNAME | NPC)) != 0 && (ts.type & SCRIPTED) == 0)
244 { 243 {
245 sensedEntities.AddRange(doAgentSensor(ts)); 244 sensedEntities.AddRange(doAgentSensor(ts));
246 } 245 }
@@ -339,7 +338,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
339 float dy; 338 float dy;
340 float dz; 339 float dz;
341 340
342 Quaternion q = SensePoint.GetWorldRotation(); 341// Quaternion q = SensePoint.RotationOffset;
342 Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation!
343 if (SensePoint.ParentGroup.IsAttachment) 343 if (SensePoint.ParentGroup.IsAttachment)
344 { 344 {
345 // In attachments, rotate the sensor cone with the 345 // In attachments, rotate the sensor cone with the
@@ -353,7 +353,8 @@ 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 q = avatar.GetWorldRotation() * q; 356 fromRegionPos = avatar.AbsolutePosition;
357 q = avatar.Rotation;
357 } 358 }
358 359
359 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); 360 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q);
@@ -397,7 +398,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
397 objtype = 0; 398 objtype = 0;
398 399
399 part = ((SceneObjectGroup)ent).RootPart; 400 part = ((SceneObjectGroup)ent).RootPart;
400 if (part.ParentGroup.AttachmentPoint != 0) // Attached so ignore 401 if (part.ParentGroup.RootPart.Shape.PCode != (byte)PCode.Tree &&
402 part.ParentGroup.RootPart.Shape.PCode != (byte)PCode.NewTree &&
403 part.ParentGroup.AttachmentPoint != 0) // Attached so ignore
401 continue; 404 continue;
402 405
403 if (part.Inventory.ContainsScripts()) 406 if (part.Inventory.ContainsScripts())
@@ -480,7 +483,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
480 // Position of a sensor in a child prim attached to an avatar 483 // Position of a sensor in a child prim attached to an avatar
481 // will be still wrong. 484 // will be still wrong.
482 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 485 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
483 q = avatar.GetWorldRotation() * q; 486 if (avatar == null)
487 return sensedEntities;
488 fromRegionPos = avatar.AbsolutePosition;
489 q = avatar.Rotation;
484 } 490 }
485 491
486 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); 492 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q);
@@ -496,7 +502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
496// "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}", 502// "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}",
497// presence.Name, presence.PresenceType, ts.name, ts.type); 503// presence.Name, presence.PresenceType, ts.name, ts.type);
498 504
499 if ((ts.type & NPC) == 0 && (ts.type & OS_NPC) == 0 && presence.PresenceType == PresenceType.Npc) 505 if ((ts.type & NPC) == 0 && presence.PresenceType == PresenceType.Npc)
500 { 506 {
501 INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); 507 INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene);
502 if (npcData == null || !npcData.SenseAsAgent) 508 if (npcData == null || !npcData.SenseAsAgent)
@@ -696,4 +702,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
696 return retList; 702 return retList;
697 } 703 }
698 } 704 }
699} \ No newline at end of file 705}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
index 0b14565..68aacd2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
@@ -123,25 +123,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
123 if (Timers.Count == 0) 123 if (Timers.Count == 0)
124 return; 124 return;
125 125
126 Dictionary<string, TimerInfo>.ValueCollection tvals;
126 lock (TimerListLock) 127 lock (TimerListLock)
127 { 128 {
128 // Go through all timers 129 // Go through all timers
129 Dictionary<string, TimerInfo>.ValueCollection tvals = Timers.Values; 130 tvals = Timers.Values;
130 foreach (TimerInfo ts in tvals) 131 }
132
133 foreach (TimerInfo ts in tvals)
134 {
135 // Time has passed?
136 if (ts.next < DateTime.Now.Ticks)
131 { 137 {
132 // Time has passed? 138 //m_log.Debug("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next);
133 if (ts.next < DateTime.Now.Ticks) 139 // Add it to queue
134 { 140 m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID,
135 //m_log.Debug("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next); 141 new EventParams("timer", new Object[0],
136 // Add it to queue 142 new DetectParams[0]));
137 m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, 143 // set next interval
138 new EventParams("timer", new Object[0], 144
139 new DetectParams[0])); 145 //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
140 // set next interval 146 ts.next = DateTime.Now.Ticks + ts.interval;
141
142 //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
143 ts.next = DateTime.Now.Ticks + ts.interval;
144 }
145 } 147 }
146 } 148 }
147 } 149 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
new file mode 100644
index 0000000..ab215f3
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
@@ -0,0 +1,46 @@
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.Collections;
29using OpenSim.Region.ScriptEngine.Interfaces;
30
31using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
32using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
33using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
34using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
35using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
36using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
37using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
38
39namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
40{
41 public interface ICM_Api
42 {
43 string cmDetectedCountry(int num);
44 string cmGetAgentCountry(key key);
45 }
46}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index ff13ee6..2260ec8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -126,6 +126,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
126 LSL_Float llGetEnergy(); 126 LSL_Float llGetEnergy();
127 LSL_Vector llGetForce(); 127 LSL_Vector llGetForce();
128 LSL_Integer llGetFreeMemory(); 128 LSL_Integer llGetFreeMemory();
129 LSL_Integer llGetUsedMemory();
129 LSL_Integer llGetFreeURLs(); 130 LSL_Integer llGetFreeURLs();
130 LSL_Vector llGetGeometricCenter(); 131 LSL_Vector llGetGeometricCenter();
131 LSL_Float llGetGMTclock(); 132 LSL_Float llGetGMTclock();
@@ -149,6 +150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
149 LSL_Vector llGetLocalPos(); 150 LSL_Vector llGetLocalPos();
150 LSL_Rotation llGetLocalRot(); 151 LSL_Rotation llGetLocalRot();
151 LSL_Float llGetMass(); 152 LSL_Float llGetMass();
153 LSL_Float llGetMassMKS();
152 LSL_Integer llGetMemoryLimit(); 154 LSL_Integer llGetMemoryLimit();
153 void llGetNextEmail(string address, string subject); 155 void llGetNextEmail(string address, string subject);
154 LSL_String llGetNotecardLine(string name, int line); 156 LSL_String llGetNotecardLine(string name, int line);
@@ -202,12 +204,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
202 LSL_String llGetTimestamp(); 204 LSL_String llGetTimestamp();
203 LSL_Vector llGetTorque(); 205 LSL_Vector llGetTorque();
204 LSL_Integer llGetUnixTime(); 206 LSL_Integer llGetUnixTime();
205 LSL_Integer llGetUsedMemory();
206 LSL_Vector llGetVel(); 207 LSL_Vector llGetVel();
207 LSL_Float llGetWallclock(); 208 LSL_Float llGetWallclock();
208 void llGiveInventory(string destination, string inventory); 209 void llGiveInventory(string destination, string inventory);
209 void llGiveInventoryList(string destination, string category, LSL_List inventory); 210 void llGiveInventoryList(string destination, string category, LSL_List inventory);
210 void llGiveMoney(string destination, int amount); 211 LSL_Integer llGiveMoney(string destination, int amount);
211 LSL_String llTransferLindenDollars(string destination, int amount); 212 LSL_String llTransferLindenDollars(string destination, int amount);
212 void llGodLikeRezObject(string inventory, LSL_Vector pos); 213 void llGodLikeRezObject(string inventory, LSL_Vector pos);
213 LSL_Float llGround(LSL_Vector offset); 214 LSL_Float llGround(LSL_Vector offset);
@@ -331,6 +332,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
331 void llSensorRemove(); 332 void llSensorRemove();
332 void llSensorRepeat(string name, string id, int type, double range, double arc, double rate); 333 void llSensorRepeat(string name, string id, int type, double range, double arc, double rate);
333 void llSetAlpha(double alpha, int face); 334 void llSetAlpha(double alpha, int face);
335 void llSetAngularVelocity(LSL_Vector angvelocity, int local);
334 void llSetBuoyancy(double buoyancy); 336 void llSetBuoyancy(double buoyancy);
335 void llSetCameraAtOffset(LSL_Vector offset); 337 void llSetCameraAtOffset(LSL_Vector offset);
336 void llSetCameraEyeOffset(LSL_Vector offset); 338 void llSetCameraEyeOffset(LSL_Vector offset);
@@ -358,11 +360,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
358 void llSetParcelMusicURL(string url); 360 void llSetParcelMusicURL(string url);
359 void llSetPayPrice(int price, LSL_List quick_pay_buttons); 361 void llSetPayPrice(int price, LSL_List quick_pay_buttons);
360 void llSetPos(LSL_Vector pos); 362 void llSetPos(LSL_Vector pos);
363 LSL_Integer llSetRegionPos(LSL_Vector pos);
361 LSL_Integer llSetPrimMediaParams(LSL_Integer face, LSL_List rules); 364 LSL_Integer llSetPrimMediaParams(LSL_Integer face, LSL_List rules);
362 void llSetPrimitiveParams(LSL_List rules); 365 void llSetPrimitiveParams(LSL_List rules);
363 void llSetLinkPrimitiveParamsFast(int linknum, LSL_List rules); 366 void llSetLinkPrimitiveParamsFast(int linknum, LSL_List rules);
364 void llSetPrimURL(string url); 367 void llSetPrimURL(string url);
365 LSL_Integer llSetRegionPos(LSL_Vector pos);
366 void llSetRemoteScriptAccessPin(int pin); 368 void llSetRemoteScriptAccessPin(int pin);
367 void llSetRot(LSL_Rotation rot); 369 void llSetRot(LSL_Rotation rot);
368 void llSetScale(LSL_Vector scale); 370 void llSetScale(LSL_Vector scale);
@@ -382,6 +384,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
382 void llSetVehicleRotationParam(int param, LSL_Rotation rot); 384 void llSetVehicleRotationParam(int param, LSL_Rotation rot);
383 void llSetVehicleType(int type); 385 void llSetVehicleType(int type);
384 void llSetVehicleVectorParam(int param, LSL_Vector vec); 386 void llSetVehicleVectorParam(int param, LSL_Vector vec);
387 void llSetVelocity(LSL_Vector velocity, int local);
385 void llShout(int channelID, string text); 388 void llShout(int channelID, string text);
386 LSL_Float llSin(double f); 389 LSL_Float llSin(double f);
387 void llSitTarget(LSL_Vector offset, LSL_Rotation rot); 390 void llSitTarget(LSL_Vector offset, LSL_Rotation rot);
@@ -425,10 +428,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
425 LSL_Vector llWind(LSL_Vector offset); 428 LSL_Vector llWind(LSL_Vector offset);
426 LSL_String llXorBase64Strings(string str1, string str2); 429 LSL_String llXorBase64Strings(string str1, string str2);
427 LSL_String llXorBase64StringsCorrect(string str1, string str2); 430 LSL_String llXorBase64StringsCorrect(string str1, string str2);
428 void print(string str); 431 LSL_Integer llGetLinkNumberOfSides(LSL_Integer link);
432 void llSetPhysicsMaterial(int material_bits, float material_gravity_modifier, float material_restitution, float material_friction, float material_density);
429 433
430 void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc); 434 void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc);
431 void llSetKeyframedMotion(LSL_List frames, LSL_List options); 435 void llSetKeyframedMotion(LSL_List frames, LSL_List options);
432 LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); 436 LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
437 LSL_List llGetPhysicsMaterial();
433 } 438 }
434} 439}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 51d0581..a652cb8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -144,7 +144,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
144 // Avatar Info Commands 144 // Avatar Info Commands
145 string osGetAgentIP(string agent); 145 string osGetAgentIP(string agent);
146 LSL_List osGetAgents(); 146 LSL_List osGetAgents();
147 147
148 // Teleport commands 148 // Teleport commands
149 void osTeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat); 149 void osTeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat);
150 void osTeleportAgent(string agent, int regionX, int regionY, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat); 150 void osTeleportAgent(string agent, int regionX, int regionY, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat);
@@ -260,7 +260,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
260 string osGetScriptEngineName(); 260 string osGetScriptEngineName();
261 string osGetSimulatorVersion(); 261 string osGetSimulatorVersion();
262 string osGetPhysicsEngineType(); 262 string osGetPhysicsEngineType();
263 Object osParseJSONNew(string JSON);
264 Hashtable osParseJSON(string JSON); 263 Hashtable osParseJSON(string JSON);
265 264
266 void osMessageObject(key objectUUID,string message); 265 void osMessageObject(key objectUUID,string message);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
new file mode 100644
index 0000000..4132dfa
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
@@ -0,0 +1,71 @@
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.Runtime.Remoting.Lifetime;
30using System.Threading;
31using System.Reflection;
32using System.Collections;
33using System.Collections.Generic;
34using OpenSim.Framework;
35using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.ScriptEngine.Interfaces;
37using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
38using integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
39using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
40using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
41using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
42using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
43using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
44using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
45using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
46
47namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
48{
49 public partial class ScriptBaseClass : MarshalByRefObject
50 {
51 public ICM_Api m_CM_Functions;
52
53 public void ApiTypeCM(IScriptApi api)
54 {
55 if (!(api is ICM_Api))
56 return;
57
58 m_CM_Functions = (ICM_Api)api;
59 }
60
61 public string cmDetectedCountry(int num)
62 {
63 return m_CM_Functions.cmDetectedCountry(num);
64 }
65
66 public string cmGetAgentCountry(key key)
67 {
68 return m_CM_Functions.cmGetAgentCountry(key);
69 }
70 }
71}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
index 9615315..943d7a2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Diagnostics; //for [DebuggerNonUserCode]
30using System.Reflection; 31using System.Reflection;
31using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
32using OpenSim.Region.ScriptEngine.Shared; 33using OpenSim.Region.ScriptEngine.Shared;
@@ -132,6 +133,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
132 return (eventFlags); 133 return (eventFlags);
133 } 134 }
134 135
136 [DebuggerNonUserCode]
135 public void ExecuteEvent(string state, string FunctionName, object[] args) 137 public void ExecuteEvent(string state, string FunctionName, object[] args)
136 { 138 {
137 // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. 139 // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 1137ad8..15b21ac 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -56,7 +56,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
56 public const int ACTIVE = 2; 56 public const int ACTIVE = 2;
57 public const int PASSIVE = 4; 57 public const int PASSIVE = 4;
58 public const int SCRIPTED = 8; 58 public const int SCRIPTED = 8;
59 public const int OS_NPC = 0x01000000;
60 59
61 public const int CONTROL_FWD = 1; 60 public const int CONTROL_FWD = 1;
62 public const int CONTROL_BACK = 2; 61 public const int CONTROL_BACK = 2;
@@ -81,6 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
81 public const int PERMISSION_CHANGE_PERMISSIONS = 512; 80 public const int PERMISSION_CHANGE_PERMISSIONS = 512;
82 public const int PERMISSION_TRACK_CAMERA = 1024; 81 public const int PERMISSION_TRACK_CAMERA = 1024;
83 public const int PERMISSION_CONTROL_CAMERA = 2048; 82 public const int PERMISSION_CONTROL_CAMERA = 2048;
83 public const int PERMISSION_TELEPORT = 4096;
84 84
85 public const int AGENT_FLYING = 1; 85 public const int AGENT_FLYING = 1;
86 public const int AGENT_ATTACHMENTS = 2; 86 public const int AGENT_ATTACHMENTS = 2;
@@ -95,6 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
95 public const int AGENT_CROUCHING = 1024; 95 public const int AGENT_CROUCHING = 1024;
96 public const int AGENT_BUSY = 2048; 96 public const int AGENT_BUSY = 2048;
97 public const int AGENT_ALWAYS_RUN = 4096; 97 public const int AGENT_ALWAYS_RUN = 4096;
98 public const int AGENT_MALE = 8192;
98 99
99 //Particle Systems 100 //Particle Systems
100 public const int PSYS_PART_INTERP_COLOR_MASK = 1; 101 public const int PSYS_PART_INTERP_COLOR_MASK = 1;
@@ -337,6 +338,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
337 public const int CHANGED_REGION_START = 1024; //LL Changed the constant from CHANGED_REGION_RESTART 338 public const int CHANGED_REGION_START = 1024; //LL Changed the constant from CHANGED_REGION_RESTART
338 public const int CHANGED_MEDIA = 2048; 339 public const int CHANGED_MEDIA = 2048;
339 public const int CHANGED_ANIMATION = 16384; 340 public const int CHANGED_ANIMATION = 16384;
341 public const int CHANGED_POSITION = 32768;
340 public const int TYPE_INVALID = 0; 342 public const int TYPE_INVALID = 0;
341 public const int TYPE_INTEGER = 1; 343 public const int TYPE_INTEGER = 1;
342 public const int TYPE_FLOAT = 2; 344 public const int TYPE_FLOAT = 2;
@@ -685,7 +687,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
685 public const int FRICTION = 2; 687 public const int FRICTION = 2;
686 public const int RESTITUTION = 4; 688 public const int RESTITUTION = 4;
687 public const int GRAVITY_MULTIPLIER = 8; 689 public const int GRAVITY_MULTIPLIER = 8;
688 690
689 // extra constants for llSetPrimMediaParams 691 // extra constants for llSetPrimMediaParams
690 public static readonly LSLInteger LSL_STATUS_OK = new LSLInteger(0); 692 public static readonly LSLInteger LSL_STATUS_OK = new LSLInteger(0);
691 public static readonly LSLInteger LSL_STATUS_MALFORMED_PARAMS = new LSLInteger(1000); 693 public static readonly LSLInteger LSL_STATUS_MALFORMED_PARAMS = new LSLInteger(1000);
@@ -757,7 +759,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
757 759
758 public static readonly LSLInteger RCERR_UNKNOWN = -1; 760 public static readonly LSLInteger RCERR_UNKNOWN = -1;
759 public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2; 761 public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2;
760 public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3; 762 public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = -3;
761 763
762 public const int KFM_MODE = 1; 764 public const int KFM_MODE = 1;
763 public const int KFM_LOOP = 1; 765 public const int KFM_LOOP = 1;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
index 87cc342..b58686b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Diagnostics; //for [DebuggerNonUserCode]
29using System.Runtime.Remoting.Lifetime; 30using System.Runtime.Remoting.Lifetime;
30using System.Threading; 31using System.Threading;
31using System.Reflection; 32using System.Reflection;
@@ -314,6 +315,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
314 m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); 315 m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel);
315 } 316 }
316 317
318 [DebuggerNonUserCode]
317 public void llDie() 319 public void llDie()
318 { 320 {
319 m_LSL_Functions.llDie(); 321 m_LSL_Functions.llDie();
@@ -474,6 +476,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
474 return m_LSL_Functions.llGetFreeMemory(); 476 return m_LSL_Functions.llGetFreeMemory();
475 } 477 }
476 478
479 public LSL_Integer llGetUsedMemory()
480 {
481 return m_LSL_Functions.llGetUsedMemory();
482 }
483
477 public LSL_Integer llGetFreeURLs() 484 public LSL_Integer llGetFreeURLs()
478 { 485 {
479 return m_LSL_Functions.llGetFreeURLs(); 486 return m_LSL_Functions.llGetFreeURLs();
@@ -554,11 +561,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
554 return m_LSL_Functions.llGetLinkNumberOfSides(link); 561 return m_LSL_Functions.llGetLinkNumberOfSides(link);
555 } 562 }
556 563
557 public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
558 {
559 m_LSL_Functions.llSetKeyframedMotion(frames, options);
560 }
561
562 public LSL_Integer llGetListEntryType(LSL_List src, int index) 564 public LSL_Integer llGetListEntryType(LSL_List src, int index)
563 { 565 {
564 return m_LSL_Functions.llGetListEntryType(src, index); 566 return m_LSL_Functions.llGetListEntryType(src, index);
@@ -584,6 +586,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
584 return m_LSL_Functions.llGetMass(); 586 return m_LSL_Functions.llGetMass();
585 } 587 }
586 588
589 public LSL_Float llGetMassMKS()
590 {
591 return m_LSL_Functions.llGetMassMKS();
592 }
593
587 public LSL_Integer llGetMemoryLimit() 594 public LSL_Integer llGetMemoryLimit()
588 { 595 {
589 return m_LSL_Functions.llGetMemoryLimit(); 596 return m_LSL_Functions.llGetMemoryLimit();
@@ -849,11 +856,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
849 return m_LSL_Functions.llGetUnixTime(); 856 return m_LSL_Functions.llGetUnixTime();
850 } 857 }
851 858
852 public LSL_Integer llGetUsedMemory()
853 {
854 return m_LSL_Functions.llGetUsedMemory();
855 }
856
857 public LSL_Vector llGetVel() 859 public LSL_Vector llGetVel()
858 { 860 {
859 return m_LSL_Functions.llGetVel(); 861 return m_LSL_Functions.llGetVel();
@@ -874,9 +876,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
874 m_LSL_Functions.llGiveInventoryList(destination, category, inventory); 876 m_LSL_Functions.llGiveInventoryList(destination, category, inventory);
875 } 877 }
876 878
877 public void llGiveMoney(string destination, int amount) 879 public LSL_Integer llGiveMoney(string destination, int amount)
878 { 880 {
879 m_LSL_Functions.llGiveMoney(destination, amount); 881 return m_LSL_Functions.llGiveMoney(destination, amount);
880 } 882 }
881 883
882 public LSL_String llTransferLindenDollars(string destination, int amount) 884 public LSL_String llTransferLindenDollars(string destination, int amount)
@@ -1493,6 +1495,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1493 m_LSL_Functions.llSetAlpha(alpha, face); 1495 m_LSL_Functions.llSetAlpha(alpha, face);
1494 } 1496 }
1495 1497
1498 public void llSetAngularVelocity(LSL_Vector angvelocity, int local)
1499 {
1500 m_LSL_Functions.llSetAngularVelocity(angvelocity, local);
1501 }
1502
1496 public void llSetBuoyancy(double buoyancy) 1503 public void llSetBuoyancy(double buoyancy)
1497 { 1504 {
1498 m_LSL_Functions.llSetBuoyancy(buoyancy); 1505 m_LSL_Functions.llSetBuoyancy(buoyancy);
@@ -1623,6 +1630,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1623 m_LSL_Functions.llSetPos(pos); 1630 m_LSL_Functions.llSetPos(pos);
1624 } 1631 }
1625 1632
1633 public LSL_Integer llSetRegionPos(LSL_Vector pos)
1634 {
1635 return m_LSL_Functions.llSetRegionPos(pos);
1636 }
1637
1626 public void llSetPrimitiveParams(LSL_List rules) 1638 public void llSetPrimitiveParams(LSL_List rules)
1627 { 1639 {
1628 m_LSL_Functions.llSetPrimitiveParams(rules); 1640 m_LSL_Functions.llSetPrimitiveParams(rules);
@@ -1638,11 +1650,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1638 m_LSL_Functions.llSetPrimURL(url); 1650 m_LSL_Functions.llSetPrimURL(url);
1639 } 1651 }
1640 1652
1641 public LSL_Integer llSetRegionPos(LSL_Vector pos)
1642 {
1643 return m_LSL_Functions.llSetRegionPos(pos);
1644 }
1645
1646 public void llSetRemoteScriptAccessPin(int pin) 1653 public void llSetRemoteScriptAccessPin(int pin)
1647 { 1654 {
1648 m_LSL_Functions.llSetRemoteScriptAccessPin(pin); 1655 m_LSL_Functions.llSetRemoteScriptAccessPin(pin);
@@ -1738,6 +1745,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1738 m_LSL_Functions.llSetVehicleVectorParam(param, vec); 1745 m_LSL_Functions.llSetVehicleVectorParam(param, vec);
1739 } 1746 }
1740 1747
1748 public void llSetVelocity(LSL_Vector velocity, int local)
1749 {
1750 m_LSL_Functions.llSetVelocity(velocity, local);
1751 }
1752
1741 public void llShout(int channelID, string text) 1753 public void llShout(int channelID, string text)
1742 { 1754 {
1743 m_LSL_Functions.llShout(channelID, text); 1755 m_LSL_Functions.llShout(channelID, text);
@@ -1988,9 +2000,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1988 return m_LSL_Functions.llClearLinkMedia(link, face); 2000 return m_LSL_Functions.llClearLinkMedia(link, face);
1989 } 2001 }
1990 2002
1991 public void print(string str) 2003 public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
2004 {
2005 return m_LSL_Functions.llGetLinkNumberOfSides(link);
2006 }
2007
2008 public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
2009 {
2010 m_LSL_Functions.llSetKeyframedMotion(frames, options);
2011 }
2012
2013 public void llSetPhysicsMaterial(int material_bits, float material_gravity_modifier, float material_restitution, float material_friction, float material_density)
2014 {
2015 m_LSL_Functions.llSetPhysicsMaterial(material_bits, material_gravity_modifier, material_restitution, material_friction, material_density);
2016 }
2017
2018 public LSL_List llGetPhysicsMaterial()
1992 { 2019 {
1993 m_LSL_Functions.print(str); 2020 return m_LSL_Functions.llGetPhysicsMaterial();
1994 } 2021 }
1995 } 2022 }
1996} 2023}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs
index 143b497..2e27f16 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LS_Stub.cs
@@ -72,9 +72,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
72 { 72 {
73 return m_LS_Functions.lsSetWindlightSceneTargeted(rules, target); 73 return m_LS_Functions.lsSetWindlightSceneTargeted(rules, target);
74 } 74 }
75
75 public void lsClearWindlightScene() 76 public void lsClearWindlightScene()
76 { 77 {
77 m_LS_Functions.lsClearWindlightScene(); 78 m_LS_Functions.lsClearWindlightScene();
78 } 79 }
80
81 public LSL_List cmGetWindlightScene(LSL_List rules)
82 {
83 return m_LS_Functions.lsGetWindlightScene(rules);
84 }
85
86 public int cmSetWindlightScene(LSL_List rules)
87 {
88 return m_LS_Functions.lsSetWindlightScene(rules);
89 }
90
91 public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
92 {
93 return m_LS_Functions.lsSetWindlightSceneTargeted(rules, target);
94 }
95
96 public void cmClearWindlightScene()
97 {
98 m_LS_Functions.lsClearWindlightScene();
99 }
79 } 100 }
80} 101}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index c9902e4..b63773b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -435,11 +435,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
435 return m_OSSL_Functions.osParseJSON(JSON); 435 return m_OSSL_Functions.osParseJSON(JSON);
436 } 436 }
437 437
438 public Object osParseJSONNew(string JSON)
439 {
440 return m_OSSL_Functions.osParseJSONNew(JSON);
441 }
442
443 public void osMessageObject(key objectUUID,string message) 438 public void osMessageObject(key objectUUID,string message)
444 { 439 {
445 m_OSSL_Functions.osMessageObject(objectUUID,message); 440 m_OSSL_Functions.osMessageObject(objectUUID,message);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
index edbbc2a..b138da3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
@@ -33,6 +33,7 @@ using System.Threading;
33using System.Reflection; 33using System.Reflection;
34using System.Collections; 34using System.Collections;
35using System.Collections.Generic; 35using System.Collections.Generic;
36using System.Diagnostics; //for [DebuggerNonUserCode]
36using OpenSim.Region.ScriptEngine.Interfaces; 37using OpenSim.Region.ScriptEngine.Interfaces;
37using OpenSim.Region.ScriptEngine.Shared; 38using OpenSim.Region.ScriptEngine.Shared;
38using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; 39using OpenSim.Region.ScriptEngine.Shared.Api.Runtime;
@@ -90,6 +91,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
90 return (int)m_Executor.GetStateEventFlags(state); 91 return (int)m_Executor.GetStateEventFlags(state);
91 } 92 }
92 93
94 [DebuggerNonUserCode]
93 public void ExecuteEvent(string state, string FunctionName, object[] args) 95 public void ExecuteEvent(string state, string FunctionName, object[] args)
94 { 96 {
95 m_Executor.ExecuteEvent(state, FunctionName, args); 97 m_Executor.ExecuteEvent(state, FunctionName, args);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
index e02d35e..e44a106 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
@@ -35,6 +35,7 @@ using OpenMetaverse;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Region.CoreModules; 36using OpenSim.Region.CoreModules;
37using OpenSim.Region.Framework.Scenes; 37using OpenSim.Region.Framework.Scenes;
38using OpenSim.Services.Interfaces;
38using OpenSim.Region.Framework.Interfaces; 39using OpenSim.Region.Framework.Interfaces;
39 40
40namespace OpenSim.Region.ScriptEngine.Shared 41namespace OpenSim.Region.ScriptEngine.Shared
@@ -120,6 +121,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
120 Type = 0; 121 Type = 0;
121 Velocity = new LSL_Types.Vector3(); 122 Velocity = new LSL_Types.Vector3();
122 initializeSurfaceTouch(); 123 initializeSurfaceTouch();
124 Country = String.Empty;
123 } 125 }
124 126
125 public UUID Key; 127 public UUID Key;
@@ -151,6 +153,8 @@ namespace OpenSim.Region.ScriptEngine.Shared
151 private int touchFace; 153 private int touchFace;
152 public int TouchFace { get { return touchFace; } } 154 public int TouchFace { get { return touchFace; } }
153 155
156 public string Country;
157
154 // This can be done in two places including the constructor 158 // This can be done in two places including the constructor
155 // so be carefull what gets added here 159 // so be carefull what gets added here
156 private void initializeSurfaceTouch() 160 private void initializeSurfaceTouch()
@@ -198,6 +202,10 @@ namespace OpenSim.Region.ScriptEngine.Shared
198 return; 202 return;
199 203
200 Name = presence.Firstname + " " + presence.Lastname; 204 Name = presence.Firstname + " " + presence.Lastname;
205 UserAccount account = scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, Key);
206 if (account != null)
207 Country = account.UserCountry;
208
201 Owner = Key; 209 Owner = Key;
202 Position = new LSL_Types.Vector3(presence.AbsolutePosition); 210 Position = new LSL_Types.Vector3(presence.AbsolutePosition);
203 Rotation = new LSL_Types.Quaternion( 211 Rotation = new LSL_Types.Quaternion(
@@ -207,22 +215,27 @@ namespace OpenSim.Region.ScriptEngine.Shared
207 presence.Rotation.W); 215 presence.Rotation.W);
208 Velocity = new LSL_Types.Vector3(presence.Velocity); 216 Velocity = new LSL_Types.Vector3(presence.Velocity);
209 217
210 if (presence.PresenceType != PresenceType.Npc) 218 Type = 0x01; // Avatar
211 { 219 if (presence.PresenceType == PresenceType.Npc)
212 Type = AGENT; 220 Type = 0x20;
213 } 221
214 else 222 // Cope Impl. We don't use OS_NPC.
215 { 223 //if (presence.PresenceType != PresenceType.Npc)
216 Type = OS_NPC; 224 //{
217 225 // Type = AGENT;
218 INPCModule npcModule = scene.RequestModuleInterface<INPCModule>(); 226 //}
219 INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene); 227 //else
220 228 //{
221 if (npcData.SenseAsAgent) 229 // Type = OS_NPC;
222 { 230
223 Type |= AGENT; 231 // INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
224 } 232 // INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene);
225 } 233
234 // if (npcData.SenseAsAgent)
235 // {
236 // Type |= AGENT;
237 // }
238 //}
226 239
227 if (presence.Velocity != Vector3.Zero) 240 if (presence.Velocity != Vector3.Zero)
228 Type |= ACTIVE; 241 Type |= ACTIVE;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 887a317..8da06d1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -30,6 +30,7 @@ using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Globalization; 31using System.Globalization;
32using System.IO; 32using System.IO;
33using System.Diagnostics; //for [DebuggerNonUserCode]
33using System.Reflection; 34using System.Reflection;
34using System.Runtime.Remoting; 35using System.Runtime.Remoting;
35using System.Runtime.Remoting.Lifetime; 36using System.Runtime.Remoting.Lifetime;
@@ -165,13 +166,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
165 166
166 public UUID ItemID { get; private set; } 167 public UUID ItemID { get; private set; }
167 168
168 public UUID ObjectID { get { return Part.UUID; } } 169 public UUID ObjectID { get; private set; }
169 170
170 public uint LocalID { get { return Part.LocalId; } } 171 public uint LocalID { get; private set; }
171 172
172 public UUID RootObjectID { get { return Part.ParentGroup.UUID; } } 173 public UUID RootObjectID { get; private set; }
173 174
174 public uint RootLocalID { get { return Part.ParentGroup.LocalId; } } 175 public uint RootLocalID { get; private set; }
175 176
176 public UUID AssetID { get; private set; } 177 public UUID AssetID { get; private set; }
177 178
@@ -235,8 +236,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
235 StartParam = startParam; 236 StartParam = startParam;
236 m_MaxScriptQueue = maxScriptQueue; 237 m_MaxScriptQueue = maxScriptQueue;
237 m_postOnRez = postOnRez; 238 m_postOnRez = postOnRez;
238 m_AttachedAvatar = Part.ParentGroup.AttachedAvatar; 239 m_AttachedAvatar = part.ParentGroup.AttachedAvatar;
239 m_RegionID = Part.ParentGroup.Scene.RegionInfo.RegionID; 240 m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID;
240 241
241 if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op") 242 if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op")
242 { 243 {
@@ -481,27 +482,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
481 PostEvent(new EventParams("attach", 482 PostEvent(new EventParams("attach",
482 new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); 483 new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0]));
483 } 484 }
485
484 } 486 }
485 } 487 }
486 488
487 private void ReleaseControls() 489 private void ReleaseControls()
488 { 490 {
489 int permsMask; 491 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
490 UUID permsGranter; 492
491 lock (Part.TaskInventory) 493 if (part != null)
492 { 494 {
493 if (!Part.TaskInventory.ContainsKey(ItemID)) 495 int permsMask;
496 UUID permsGranter;
497 part.TaskInventory.LockItemsForRead(true);
498 if (!part.TaskInventory.ContainsKey(ItemID))
499 {
500 part.TaskInventory.LockItemsForRead(false);
494 return; 501 return;
502 }
503 permsGranter = part.TaskInventory[ItemID].PermsGranter;
504 permsMask = part.TaskInventory[ItemID].PermsMask;
505 part.TaskInventory.LockItemsForRead(false);
495 506
496 permsGranter = Part.TaskInventory[ItemID].PermsGranter; 507 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
497 permsMask = Part.TaskInventory[ItemID].PermsMask; 508 {
498 } 509 ScenePresence presence = Engine.World.GetScenePresence(permsGranter);
499 510 if (presence != null)
500 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 511 presence.UnRegisterControlEventsToScript(LocalID, ItemID);
501 { 512 }
502 ScenePresence presence = Engine.World.GetScenePresence(permsGranter);
503 if (presence != null)
504 presence.UnRegisterControlEventsToScript(LocalID, ItemID);
505 } 513 }
506 } 514 }
507 515
@@ -656,6 +664,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
656 return true; 664 return true;
657 } 665 }
658 666
667 [DebuggerNonUserCode] //Prevents the debugger from farting in this function
659 public void SetState(string state) 668 public void SetState(string state)
660 { 669 {
661 if (state == State) 670 if (state == State)
@@ -667,7 +676,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
667 new DetectParams[0])); 676 new DetectParams[0]));
668 PostEvent(new EventParams("state_entry", new Object[0], 677 PostEvent(new EventParams("state_entry", new Object[0],
669 new DetectParams[0])); 678 new DetectParams[0]));
670 679
671 throw new EventAbortException(); 680 throw new EventAbortException();
672 } 681 }
673 682
@@ -757,57 +766,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
757 /// <returns></returns> 766 /// <returns></returns>
758 public object EventProcessor() 767 public object EventProcessor()
759 { 768 {
769 EventParams data = null;
760 // We check here as the thread stopping this instance from running may itself hold the m_Script lock. 770 // We check here as the thread stopping this instance from running may itself hold the m_Script lock.
761 if (!Running) 771 if (!Running)
762 return 0; 772 return 0;
763 773
764 lock (m_Script)
765 {
766// m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName); 774// m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName);
767 775
768 if (Suspended) 776 if (Suspended)
769 return 0; 777 return 0;
770
771 EventParams data = null;
772 778
773 lock (EventQueue) 779 lock (EventQueue)
780 {
781 data = (EventParams) EventQueue.Dequeue();
782 if (data == null) // Shouldn't happen
774 { 783 {
775 data = (EventParams)EventQueue.Dequeue(); 784 if (EventQueue.Count > 0 && Running && !ShuttingDown)
776 if (data == null) // Shouldn't happen
777 { 785 {
778 if (EventQueue.Count > 0 && Running && !ShuttingDown) 786 m_CurrentWorkItem = Engine.QueueEventHandler(this);
779 {
780 m_CurrentWorkItem = Engine.QueueEventHandler(this);
781 }
782 else
783 {
784 m_CurrentWorkItem = null;
785 }
786 return 0;
787 } 787 }
788 788 else
789 if (data.EventName == "timer")
790 m_TimerQueued = false;
791 if (data.EventName == "control")
792 { 789 {
793 if (m_ControlEventsInQueue > 0) 790 m_CurrentWorkItem = null;
794 m_ControlEventsInQueue--;
795 } 791 }
796 if (data.EventName == "collision") 792 return 0;
797 m_CollisionInQueue = false;
798 } 793 }
799 794
795 if (data.EventName == "timer")
796 m_TimerQueued = false;
797 if (data.EventName == "control")
798 {
799 if (m_ControlEventsInQueue > 0)
800 m_ControlEventsInQueue--;
801 }
802 if (data.EventName == "collision")
803 m_CollisionInQueue = false;
804 }
805
806 lock(m_Script)
807 {
808
809// m_log.DebugFormat("[XEngine]: Processing event {0} for {1}", data.EventName, this);
810 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
811
800 if (DebugLevel >= 2) 812 if (DebugLevel >= 2)
801 m_log.DebugFormat( 813 m_log.DebugFormat(
802 "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", 814 "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}",
803 data.EventName, 815 data.EventName,
804 ScriptName, 816 ScriptName,
805 Part.Name, 817 part.Name,
806 Part.LocalId, 818 part.LocalId,
807 Part.ParentGroup.Name, 819 part.ParentGroup.Name,
808 Part.ParentGroup.UUID, 820 part.ParentGroup.UUID,
809 Part.AbsolutePosition, 821 part.AbsolutePosition,
810 Part.ParentGroup.Scene.Name); 822 part.ParentGroup.Scene.Name);
811 823
812 m_DetectParams = data.DetectParams; 824 m_DetectParams = data.DetectParams;
813 825
@@ -820,17 +832,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
820 "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}", 832 "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}",
821 State, 833 State,
822 ScriptName, 834 ScriptName,
823 Part.Name, 835 part.Name,
824 Part.LocalId, 836 part.LocalId,
825 Part.ParentGroup.Name, 837 part.ParentGroup.Name,
826 Part.ParentGroup.UUID, 838 part.ParentGroup.UUID,
827 Part.AbsolutePosition, 839 part.AbsolutePosition,
828 Part.ParentGroup.Scene.Name); 840 part.ParentGroup.Scene.Name);
829 841
830 AsyncCommandManager.RemoveScript(Engine, 842 AsyncCommandManager.RemoveScript(Engine,
831 LocalID, ItemID); 843 LocalID, ItemID);
832 844
833 Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); 845 if (part != null)
846 {
847 part.SetScriptEvents(ItemID,
848 (int)m_Script.GetStateEventFlags(State));
849 }
834 } 850 }
835 else 851 else
836 { 852 {
@@ -893,17 +909,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
893 text = text.Substring(0, 1000); 909 text = text.Substring(0, 1000);
894 Engine.World.SimChat(Utils.StringToBytes(text), 910 Engine.World.SimChat(Utils.StringToBytes(text),
895 ChatTypeEnum.DebugChannel, 2147483647, 911 ChatTypeEnum.DebugChannel, 2147483647,
896 Part.AbsolutePosition, 912 part.AbsolutePosition,
897 Part.Name, Part.UUID, false); 913 part.Name, part.UUID, false);
898 914
899 915
900 m_log.DebugFormat( 916 m_log.DebugFormat(
901 "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4}, displayed error {5}, actual exception {6}", 917 "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4}, displayed error {5}, actual exception {6}",
902 ScriptName, 918 ScriptName,
903 PrimName, 919 PrimName,
904 Part.UUID, 920 part.UUID,
905 Part.AbsolutePosition, 921 part.AbsolutePosition,
906 Part.ParentGroup.Scene.Name, 922 part.ParentGroup.Scene.Name,
907 text.Replace("\n", "\\n"), 923 text.Replace("\n", "\\n"),
908 e.InnerException); 924 e.InnerException);
909 } 925 }
@@ -923,12 +939,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
923 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException)) 939 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
924 { 940 {
925 m_InSelfDelete = true; 941 m_InSelfDelete = true;
926 Engine.World.DeleteSceneObject(Part.ParentGroup, false); 942 if (part != null)
943 Engine.World.DeleteSceneObject(part.ParentGroup, false);
927 } 944 }
928 else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) 945 else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException))
929 { 946 {
930 m_InSelfDelete = true; 947 m_InSelfDelete = true;
931 Part.Inventory.RemoveInventoryItem(ItemID); 948 if (part != null)
949 part.Inventory.RemoveInventoryItem(ItemID);
932 } 950 }
933 else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException)) 951 else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException))
934 { 952 {
@@ -982,14 +1000,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
982 ReleaseControls(); 1000 ReleaseControls();
983 1001
984 Stop(timeout); 1002 Stop(timeout);
985 Part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 1003 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
986 Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 1004 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
1005 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
1006 part.CollisionSound = UUID.Zero;
987 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); 1007 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
988 EventQueue.Clear(); 1008 EventQueue.Clear();
989 m_Script.ResetVars(); 1009 m_Script.ResetVars();
990 State = "default"; 1010 State = "default";
991 1011
992 Part.SetScriptEvents(ItemID, 1012 part.SetScriptEvents(ItemID,
993 (int)m_Script.GetStateEventFlags(State)); 1013 (int)m_Script.GetStateEventFlags(State));
994 if (running) 1014 if (running)
995 Start(); 1015 Start();
@@ -998,6 +1018,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
998 new Object[0], new DetectParams[0])); 1018 new Object[0], new DetectParams[0]));
999 } 1019 }
1000 1020
1021 [DebuggerNonUserCode] //Stops the VS debugger from farting in this function
1001 public void ApiResetScript() 1022 public void ApiResetScript()
1002 { 1023 {
1003 // bool running = Running; 1024 // bool running = Running;
@@ -1006,15 +1027,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1006 ReleaseControls(); 1027 ReleaseControls();
1007 1028
1008 m_Script.ResetVars(); 1029 m_Script.ResetVars();
1009 Part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 1030 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
1010 Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 1031 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
1032 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
1033 part.CollisionSound = UUID.Zero;
1011 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID); 1034 AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
1012 1035
1013 EventQueue.Clear(); 1036 EventQueue.Clear();
1014 m_Script.ResetVars(); 1037 m_Script.ResetVars();
1015 State = "default"; 1038 State = "default";
1016 1039
1017 Part.SetScriptEvents(ItemID, 1040 part.SetScriptEvents(ItemID,
1018 (int)m_Script.GetStateEventFlags(State)); 1041 (int)m_Script.GetStateEventFlags(State));
1019 1042
1020 if (m_CurrentEvent != "state_entry") 1043 if (m_CurrentEvent != "state_entry")
@@ -1028,10 +1051,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1028 1051
1029 public Dictionary<string, object> GetVars() 1052 public Dictionary<string, object> GetVars()
1030 { 1053 {
1031 if (m_Script != null) 1054 return m_Script.GetVars();
1032 return m_Script.GetVars();
1033 else
1034 return new Dictionary<string, object>();
1035 } 1055 }
1036 1056
1037 public void SetVars(Dictionary<string, object> vars) 1057 public void SetVars(Dictionary<string, object> vars)
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index 50f9377..4ba0e64 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -102,19 +102,19 @@ namespace OpenSim.Region.ScriptEngine.Shared
102 102
103 public override string ToString() 103 public override string ToString()
104 { 104 {
105 string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000}>", x, y, z); 105 string s=String.Format("<{0:0.000000}, {1:0.000000}, {2:0.000000}>", x, y, z);
106 return s; 106 return s;
107 } 107 }
108 108
109 public static explicit operator LSLString(Vector3 vec) 109 public static explicit operator LSLString(Vector3 vec)
110 { 110 {
111 string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000}>", vec.x, vec.y, vec.z); 111 string s=String.Format("<{0:0.000000}, {1:0.000000}, {2:0.000000}>", vec.x, vec.y, vec.z);
112 return new LSLString(s); 112 return new LSLString(s);
113 } 113 }
114 114
115 public static explicit operator string(Vector3 vec) 115 public static explicit operator string(Vector3 vec)
116 { 116 {
117 string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000}>", vec.x, vec.y, vec.z); 117 string s=String.Format("<{0:0.000000}, {1:0.000000}, {2:0.000000}>", vec.x, vec.y, vec.z);
118 return s; 118 return s;
119 } 119 }
120 120
@@ -414,19 +414,19 @@ namespace OpenSim.Region.ScriptEngine.Shared
414 414
415 public override string ToString() 415 public override string ToString()
416 { 416 {
417 string st=String.Format(Culture.FormatProvider, "<{0:0.000000},{1:0.000000},{2:0.000000},{3:0.000000}>", x, y, z, s); 417 string st=String.Format(Culture.FormatProvider, "<{0:0.000000}, {1:0.000000}, {2:0.000000}, {3:0.000000}>", x, y, z, s);
418 return st; 418 return st;
419 } 419 }
420 420
421 public static explicit operator string(Quaternion r) 421 public static explicit operator string(Quaternion r)
422 { 422 {
423 string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000},{3:0.000000}>", r.x, r.y, r.z, r.s); 423 string s=String.Format("<{0:0.000000}, {1:0.000000}, {2:0.000000}, {3:0.000000}>", r.x, r.y, r.z, r.s);
424 return s; 424 return s;
425 } 425 }
426 426
427 public static explicit operator LSLString(Quaternion r) 427 public static explicit operator LSLString(Quaternion r)
428 { 428 {
429 string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000},{3:0.000000}>", r.x, r.y, r.z, r.s); 429 string s=String.Format("<{0:0.000000}, {1:0.000000}, {2:0.000000}, {3:0.000000}>", r.x, r.y, r.z, r.s);
430 return new LSLString(s); 430 return new LSLString(s);
431 } 431 }
432 432
@@ -537,7 +537,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
537 else if (o is LSL_Types.LSLFloat) 537 else if (o is LSL_Types.LSLFloat)
538 size += 8; 538 size += 8;
539 else if (o is LSL_Types.LSLString) 539 else if (o is LSL_Types.LSLString)
540 size += ((LSL_Types.LSLString)o).m_string.Length; 540 size += ((LSL_Types.LSLString)o).m_string == null ? 0 : ((LSL_Types.LSLString)o).m_string.Length;
541 else if (o is LSL_Types.key) 541 else if (o is LSL_Types.key)
542 size += ((LSL_Types.key)o).value.Length; 542 size += ((LSL_Types.key)o).value.Length;
543 else if (o is LSL_Types.Vector3) 543 else if (o is LSL_Types.Vector3)
@@ -546,6 +546,8 @@ namespace OpenSim.Region.ScriptEngine.Shared
546 size += 64; 546 size += 64;
547 else if (o is int) 547 else if (o is int)
548 size += 4; 548 size += 4;
549 else if (o is uint)
550 size += 4;
549 else if (o is string) 551 else if (o is string)
550 size += ((string)o).Length; 552 size += ((string)o).Length;
551 else if (o is float) 553 else if (o is float)
@@ -736,24 +738,16 @@ namespace OpenSim.Region.ScriptEngine.Shared
736 738
737 public static bool operator ==(list a, list b) 739 public static bool operator ==(list a, list b)
738 { 740 {
739 int la = -1; 741 int la = a.Length;
740 int lb = -1; 742 int lb = b.Length;
741 try { la = a.Length; }
742 catch (NullReferenceException) { }
743 try { lb = b.Length; }
744 catch (NullReferenceException) { }
745 743
746 return la == lb; 744 return la == lb;
747 } 745 }
748 746
749 public static bool operator !=(list a, list b) 747 public static bool operator !=(list a, list b)
750 { 748 {
751 int la = -1; 749 int la = a.Length;
752 int lb = -1; 750 int lb = b.Length;
753 try { la = a.Length; }
754 catch (NullReferenceException) { }
755 try {lb = b.Length;}
756 catch (NullReferenceException) { }
757 751
758 return la != lb; 752 return la != lb;
759 } 753 }
@@ -987,7 +981,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
987 ret = Math.Sign(Quaternion.Mag(l) - Quaternion.Mag(r)); 981 ret = Math.Sign(Quaternion.Mag(l) - Quaternion.Mag(r));
988 } 982 }
989 983
990 if (ascending == 0) 984 if (ascending != 1)
991 { 985 {
992 ret = 0 - ret; 986 ret = 0 - ret;
993 } 987 }
@@ -1020,6 +1014,9 @@ namespace OpenSim.Region.ScriptEngine.Shared
1020 stride = 1; 1014 stride = 1;
1021 } 1015 }
1022 1016
1017 if ((Data.Length % stride) != 0)
1018 return new list(ret);
1019
1023 // we can optimize here in the case where stride == 1 and the list 1020 // we can optimize here in the case where stride == 1 and the list
1024 // consists of homogeneous types 1021 // consists of homogeneous types
1025 1022
@@ -1039,7 +1036,7 @@ namespace OpenSim.Region.ScriptEngine.Shared
1039 if (homogeneous) 1036 if (homogeneous)
1040 { 1037 {
1041 Array.Sort(ret, new HomogeneousComparer()); 1038 Array.Sort(ret, new HomogeneousComparer());
1042 if (ascending == 0) 1039 if (ascending != 1)
1043 { 1040 {
1044 Array.Reverse(ret); 1041 Array.Reverse(ret);
1045 } 1042 }