aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs1261
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs61
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs13
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs60
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs1
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Helpers.cs28
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs77
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/EventManager.cs24
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs57
14 files changed, 898 insertions, 719 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index d5e611c..4335592 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -426,14 +426,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
426 return key; 426 return key;
427 } 427 }
428 428
429 // convert a LSL_Rotation to a Quaternion
430 public static Quaternion Rot2Quaternion(LSL_Rotation r)
431 {
432 Quaternion q = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
433 q.Normalize();
434 return q;
435 }
436
437 //These are the implementations of the various ll-functions used by the LSL scripts. 429 //These are the implementations of the various ll-functions used by the LSL scripts.
438 public LSL_Float llSin(double f) 430 public LSL_Float llSin(double f)
439 { 431 {
@@ -1240,9 +1232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1240 public LSL_Float llGround(LSL_Vector offset) 1232 public LSL_Float llGround(LSL_Vector offset)
1241 { 1233 {
1242 m_host.AddScriptLPS(1); 1234 m_host.AddScriptLPS(1);
1243 Vector3 pos = m_host.GetWorldPosition() + new Vector3((float)offset.x, 1235 Vector3 pos = m_host.GetWorldPosition() + (Vector3)offset;
1244 (float)offset.y,
1245 (float)offset.z);
1246 1236
1247 //Get the slope normal. This gives us the equation of the plane tangent to the slope. 1237 //Get the slope normal. This gives us the equation of the plane tangent to the slope.
1248 LSL_Vector vsn = llGroundNormal(offset); 1238 LSL_Vector vsn = llGroundNormal(offset);
@@ -1492,31 +1482,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1492 if (part == null || part.ParentGroup.IsDeleted) 1482 if (part == null || part.ParentGroup.IsDeleted)
1493 return; 1483 return;
1494 1484
1495 if (scale.x < 0.01) 1485 // First we need to check whether or not we need to clamp the size of a physics-enabled prim
1496 scale.x = 0.01;
1497 if (scale.y < 0.01)
1498 scale.y = 0.01;
1499 if (scale.z < 0.01)
1500 scale.z = 0.01;
1501
1502 PhysicsActor pa = part.ParentGroup.RootPart.PhysActor; 1486 PhysicsActor pa = part.ParentGroup.RootPart.PhysActor;
1503
1504 if (pa != null && pa.IsPhysical) 1487 if (pa != null && pa.IsPhysical)
1505 { 1488 {
1506 if (scale.x > World.m_maxPhys) 1489 scale.x = Math.Max(World.m_minPhys, Math.Min(World.m_maxPhys, scale.x));
1507 scale.x = World.m_maxPhys; 1490 scale.y = Math.Max(World.m_minPhys, Math.Min(World.m_maxPhys, scale.y));
1508 if (scale.y > World.m_maxPhys) 1491 scale.z = Math.Max(World.m_minPhys, Math.Min(World.m_maxPhys, scale.z));
1509 scale.y = World.m_maxPhys; 1492 }
1510 if (scale.z > World.m_maxPhys) 1493 else
1511 scale.z = World.m_maxPhys; 1494 {
1495 // If not physical, then we clamp the scale to the non-physical min/max
1496 scale.x = Math.Max(World.m_minNonphys, Math.Min(World.m_maxNonphys, scale.x));
1497 scale.y = Math.Max(World.m_minNonphys, Math.Min(World.m_maxNonphys, scale.y));
1498 scale.z = Math.Max(World.m_minNonphys, Math.Min(World.m_maxNonphys, scale.z));
1512 } 1499 }
1513
1514 if (scale.x > World.m_maxNonphys)
1515 scale.x = World.m_maxNonphys;
1516 if (scale.y > World.m_maxNonphys)
1517 scale.y = World.m_maxNonphys;
1518 if (scale.z > World.m_maxNonphys)
1519 scale.z = World.m_maxNonphys;
1520 1500
1521 Vector3 tmp = part.Scale; 1501 Vector3 tmp = part.Scale;
1522 tmp.X = (float)scale.x; 1502 tmp.X = (float)scale.x;
@@ -1590,7 +1570,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1590 if (face == ScriptBaseClass.ALL_SIDES) 1570 if (face == ScriptBaseClass.ALL_SIDES)
1591 face = SceneObjectPart.ALL_SIDES; 1571 face = SceneObjectPart.ALL_SIDES;
1592 1572
1593 m_host.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); 1573 m_host.SetFaceColorAlpha(face, color, null);
1594 } 1574 }
1595 1575
1596 public void SetTexGen(SceneObjectPart part, int face,int style) 1576 public void SetTexGen(SceneObjectPart part, int face,int style)
@@ -2220,7 +2200,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2220 2200
2221 bool sameParcel = here.GlobalID == there.GlobalID; 2201 bool sameParcel = here.GlobalID == there.GlobalID;
2222 2202
2223 if (!sameParcel && !World.Permissions.CanObjectEntry(m_host.UUID, false, new Vector3((float)pos.x, (float)pos.y, (float)pos.z))) 2203 if (!sameParcel && !World.Permissions.CanRezObject(
2204 m_host.ParentGroup.PrimCount, m_host.ParentGroup.OwnerID, pos))
2224 { 2205 {
2225 return 0; 2206 return 0;
2226 } 2207 }
@@ -2279,16 +2260,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2279 if (part.ParentGroup.RootPart == part) 2260 if (part.ParentGroup.RootPart == part)
2280 { 2261 {
2281 SceneObjectGroup parent = part.ParentGroup; 2262 SceneObjectGroup parent = part.ParentGroup;
2282 Vector3 dest = new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z); 2263 if (!World.Permissions.CanObjectEntry(parent.UUID, false, (Vector3)toPos))
2283 if (!World.Permissions.CanObjectEntry(parent.UUID, false, dest))
2284 return; 2264 return;
2285 Util.FireAndForget(delegate(object x) { 2265 Util.FireAndForget(delegate(object x) {
2286 parent.UpdateGroupPosition(dest); 2266 parent.UpdateGroupPosition((Vector3)toPos);
2287 }); 2267 });
2288 } 2268 }
2289 else 2269 else
2290 { 2270 {
2291 part.OffsetPosition = new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z); 2271 part.OffsetPosition = (Vector3)toPos;
2292 SceneObjectGroup parent = part.ParentGroup; 2272 SceneObjectGroup parent = part.ParentGroup;
2293 parent.HasGroupChanged = true; 2273 parent.HasGroupChanged = true;
2294 parent.ScheduleGroupForTerseUpdate(); 2274 parent.ScheduleGroupForTerseUpdate();
@@ -2326,7 +2306,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2326 pos = part.AbsolutePosition; 2306 pos = part.AbsolutePosition;
2327 } 2307 }
2328 2308
2329 return new LSL_Vector(pos.X, pos.Y, pos.Z); 2309// m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos);
2310
2311 return new LSL_Vector(pos);
2330 } 2312 }
2331 2313
2332 public void llSetRot(LSL_Rotation rot) 2314 public void llSetRot(LSL_Rotation rot)
@@ -2343,7 +2325,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2343 // using it would cause attachments and HUDs to rotate 2325 // using it would cause attachments and HUDs to rotate
2344 // to the wrong positions. 2326 // to the wrong positions.
2345 2327
2346 SetRot(m_host, Rot2Quaternion(rot)); 2328 SetRot(m_host, rot);
2347 } 2329 }
2348 else 2330 else
2349 { 2331 {
@@ -2353,7 +2335,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2353 { 2335 {
2354 rootPart = m_host.ParentGroup.RootPart; 2336 rootPart = m_host.ParentGroup.RootPart;
2355 if (rootPart != null) 2337 if (rootPart != null)
2356 SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot)); 2338 SetRot(m_host, rootPart.RotationOffset * (Quaternion)rot);
2357 } 2339 }
2358 } 2340 }
2359 2341
@@ -2363,8 +2345,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2363 public void llSetLocalRot(LSL_Rotation rot) 2345 public void llSetLocalRot(LSL_Rotation rot)
2364 { 2346 {
2365 m_host.AddScriptLPS(1); 2347 m_host.AddScriptLPS(1);
2366 2348 SetRot(m_host, rot);
2367 SetRot(m_host, Rot2Quaternion(rot));
2368 ScriptSleep(200); 2349 ScriptSleep(200);
2369 } 2350 }
2370 2351
@@ -2476,7 +2457,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2476 if (local != 0) 2457 if (local != 0)
2477 force *= llGetRot(); 2458 force *= llGetRot();
2478 2459
2479 m_host.ParentGroup.RootPart.SetForce(new Vector3((float)force.x, (float)force.y, (float)force.z)); 2460 m_host.ParentGroup.RootPart.SetForce(force);
2480 } 2461 }
2481 } 2462 }
2482 2463
@@ -2488,10 +2469,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2488 2469
2489 if (!m_host.ParentGroup.IsDeleted) 2470 if (!m_host.ParentGroup.IsDeleted)
2490 { 2471 {
2491 Vector3 tmpForce = m_host.ParentGroup.RootPart.GetForce(); 2472 force = m_host.ParentGroup.RootPart.GetForce();
2492 force.x = tmpForce.X;
2493 force.y = tmpForce.Y;
2494 force.z = tmpForce.Z;
2495 } 2473 }
2496 2474
2497 return force; 2475 return force;
@@ -2500,8 +2478,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2500 public LSL_Integer llTarget(LSL_Vector position, double range) 2478 public LSL_Integer llTarget(LSL_Vector position, double range)
2501 { 2479 {
2502 m_host.AddScriptLPS(1); 2480 m_host.AddScriptLPS(1);
2503 return m_host.ParentGroup.registerTargetWaypoint( 2481 return m_host.ParentGroup.registerTargetWaypoint(position,
2504 new Vector3((float)position.x, (float)position.y, (float)position.z), (float)range); 2482 (float)range);
2505 } 2483 }
2506 2484
2507 public void llTargetRemove(int number) 2485 public void llTargetRemove(int number)
@@ -2513,8 +2491,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2513 public LSL_Integer llRotTarget(LSL_Rotation rot, double error) 2491 public LSL_Integer llRotTarget(LSL_Rotation rot, double error)
2514 { 2492 {
2515 m_host.AddScriptLPS(1); 2493 m_host.AddScriptLPS(1);
2516 return m_host.ParentGroup.registerRotTargetWaypoint( 2494 return m_host.ParentGroup.registerRotTargetWaypoint(rot, (float)error);
2517 new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s), (float)error);
2518 } 2495 }
2519 2496
2520 public void llRotTargetRemove(int number) 2497 public void llRotTargetRemove(int number)
@@ -2526,7 +2503,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2526 public void llMoveToTarget(LSL_Vector target, double tau) 2503 public void llMoveToTarget(LSL_Vector target, double tau)
2527 { 2504 {
2528 m_host.AddScriptLPS(1); 2505 m_host.AddScriptLPS(1);
2529 m_host.MoveToTarget(new Vector3((float)target.x, (float)target.y, (float)target.z), (float)tau); 2506 m_host.MoveToTarget(target, (float)tau);
2530 } 2507 }
2531 2508
2532 public void llStopMoveToTarget() 2509 public void llStopMoveToTarget()
@@ -2539,7 +2516,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2539 { 2516 {
2540 m_host.AddScriptLPS(1); 2517 m_host.AddScriptLPS(1);
2541 //No energy force yet 2518 //No energy force yet
2542 Vector3 v = new Vector3((float)force.x, (float)force.y, (float)force.z); 2519 Vector3 v = force;
2543 if (v.Length() > 20000.0f) 2520 if (v.Length() > 20000.0f)
2544 { 2521 {
2545 v.Normalize(); 2522 v.Normalize();
@@ -2552,13 +2529,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2552 public void llApplyRotationalImpulse(LSL_Vector force, int local) 2529 public void llApplyRotationalImpulse(LSL_Vector force, int local)
2553 { 2530 {
2554 m_host.AddScriptLPS(1); 2531 m_host.AddScriptLPS(1);
2555 m_host.ParentGroup.RootPart.ApplyAngularImpulse(new Vector3((float)force.x, (float)force.y, (float)force.z), local != 0); 2532 m_host.ParentGroup.RootPart.ApplyAngularImpulse(force, local != 0);
2556 } 2533 }
2557 2534
2558 public void llSetTorque(LSL_Vector torque, int local) 2535 public void llSetTorque(LSL_Vector torque, int local)
2559 { 2536 {
2560 m_host.AddScriptLPS(1); 2537 m_host.AddScriptLPS(1);
2561 m_host.ParentGroup.RootPart.SetAngularImpulse(new Vector3((float)torque.x, (float)torque.y, (float)torque.z), local != 0); 2538 m_host.ParentGroup.RootPart.SetAngularImpulse(torque, local != 0);
2562 } 2539 }
2563 2540
2564 public LSL_Vector llGetTorque() 2541 public LSL_Vector llGetTorque()
@@ -3123,13 +3100,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3123 return; 3100 return;
3124 } 3101 }
3125 3102
3126 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
3127 Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z);
3128
3129 // need the magnitude later 3103 // need the magnitude later
3130 // float velmag = (float)Util.GetMagnitude(llvel); 3104 // float velmag = (float)Util.GetMagnitude(llvel);
3131 3105
3132 SceneObjectGroup new_group = World.RezObject(m_host, item, llpos, Rot2Quaternion(rot), llvel, param); 3106 SceneObjectGroup new_group = World.RezObject(m_host, item, pos, rot, vel, param);
3133 3107
3134 // If either of these are null, then there was an unknown error. 3108 // If either of these are null, then there was an unknown error.
3135 if (new_group == null) 3109 if (new_group == null)
@@ -3156,11 +3130,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3156 3130
3157 PhysicsActor pa = new_group.RootPart.PhysActor; 3131 PhysicsActor pa = new_group.RootPart.PhysActor;
3158 3132
3159 if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) 3133 if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero)
3160 { 3134 {
3161 float groupmass = new_group.GetMass(); 3135 float groupmass = new_group.GetMass();
3162 llvel *= -groupmass; 3136 vel *= -groupmass;
3163 llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0); 3137 llApplyImpulse(vel, 0);
3164 } 3138 }
3165 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) 3139 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3166 return; 3140 return;
@@ -3211,7 +3185,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3211 return; 3185 return;
3212 } 3186 }
3213 3187
3214 m_host.StartLookAt(Rot2Quaternion(r3 * r2 * r1), (float)strength, (float)damping); 3188 m_host.StartLookAt((Quaternion)(r3 * r2 * r1), (float)strength, (float)damping);
3215 } 3189 }
3216 } 3190 }
3217 3191
@@ -3637,7 +3611,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3637 } 3611 }
3638 else 3612 else
3639 { 3613 {
3640 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping); 3614 m_host.RotLookAt(target, (float)strength, (float)damping);
3641 } 3615 }
3642 } 3616 }
3643 3617
@@ -3718,7 +3692,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3718 3692
3719 protected void TargetOmega(SceneObjectPart part, LSL_Vector axis, double spinrate, double gain) 3693 protected void TargetOmega(SceneObjectPart part, LSL_Vector axis, double spinrate, double gain)
3720 { 3694 {
3721 part.UpdateAngularVelocity(new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate))); 3695 part.UpdateAngularVelocity(axis * spinrate);
3722 } 3696 }
3723 3697
3724 public LSL_Integer llGetStartParameter() 3698 public LSL_Integer llGetStartParameter()
@@ -3928,7 +3902,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3928 try 3902 try
3929 { 3903 {
3930 foreach (SceneObjectPart part in parts) 3904 foreach (SceneObjectPart part in parts)
3931 part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); 3905 part.SetFaceColorAlpha(face, color, null);
3932 } 3906 }
3933 finally 3907 finally
3934 { 3908 {
@@ -4398,9 +4372,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4398 public void llSetText(string text, LSL_Vector color, double alpha) 4372 public void llSetText(string text, LSL_Vector color, double alpha)
4399 { 4373 {
4400 m_host.AddScriptLPS(1); 4374 m_host.AddScriptLPS(1);
4401 Vector3 av3 = new Vector3(Util.Clip((float)color.x, 0.0f, 1.0f), 4375 Vector3 av3 = Util.Clip(color, 0.0f, 1.0f);
4402 Util.Clip((float)color.y, 0.0f, 1.0f),
4403 Util.Clip((float)color.z, 0.0f, 1.0f));
4404 m_host.SetText(text.Length > 254 ? text.Remove(254) : text, av3, Util.Clip((float)alpha, 0.0f, 1.0f)); 4376 m_host.SetText(text.Length > 254 ? text.Remove(254) : text, av3, Util.Clip((float)alpha, 0.0f, 1.0f));
4405 //m_host.ParentGroup.HasGroupChanged = true; 4377 //m_host.ParentGroup.HasGroupChanged = true;
4406 //m_host.ParentGroup.ScheduleGroupForFullUpdate(); 4378 //m_host.ParentGroup.ScheduleGroupForFullUpdate();
@@ -4616,14 +4588,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4616 ScriptSleep(5000); 4588 ScriptSleep(5000);
4617 } 4589 }
4618 4590
4619 public void llTeleportAgent(string agent, string destination, LSL_Vector pos, LSL_Vector lookAt) 4591 public void llTeleportAgent(string agent, string destination, LSL_Vector targetPos, LSL_Vector targetLookAt)
4620 { 4592 {
4621 m_host.AddScriptLPS(1); 4593 m_host.AddScriptLPS(1);
4622 UUID agentId = new UUID(); 4594 UUID agentId = new UUID();
4623 4595
4624 Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
4625 Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z);
4626
4627 if (UUID.TryParse(agent, out agentId)) 4596 if (UUID.TryParse(agent, out agentId))
4628 { 4597 {
4629 ScenePresence presence = World.GetScenePresence(agentId); 4598 ScenePresence presence = World.GetScenePresence(agentId);
@@ -4652,15 +4621,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4652 } 4621 }
4653 } 4622 }
4654 4623
4655 public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector pos, LSL_Vector lookAt) 4624 public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector targetPos, LSL_Vector targetLookAt)
4656 { 4625 {
4657 m_host.AddScriptLPS(1); 4626 m_host.AddScriptLPS(1);
4658 UUID agentId = new UUID(); 4627 UUID agentId = new UUID();
4659 4628
4660 ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y); 4629 ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y);
4661 4630
4662 Vector3 targetPos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
4663 Vector3 targetLookAt = new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z);
4664 if (UUID.TryParse(agent, out agentId)) 4631 if (UUID.TryParse(agent, out agentId))
4665 { 4632 {
4666 ScenePresence presence = World.GetScenePresence(agentId); 4633 ScenePresence presence = World.GetScenePresence(agentId);
@@ -4957,7 +4924,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4957 distance_attenuation = 1f / normalized_units; 4924 distance_attenuation = 1f / normalized_units;
4958 } 4925 }
4959 4926
4960 Vector3 applied_linear_impulse = new Vector3((float)impulse.x, (float)impulse.y, (float)impulse.z); 4927 Vector3 applied_linear_impulse = impulse;
4961 { 4928 {
4962 float impulse_length = applied_linear_impulse.Length(); 4929 float impulse_length = applied_linear_impulse.Length();
4963 4930
@@ -5605,25 +5572,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5605 /// separated list. There is a space after 5572 /// separated list. There is a space after
5606 /// each comma. 5573 /// each comma.
5607 /// </summary> 5574 /// </summary>
5608
5609 public LSL_String llList2CSV(LSL_List src) 5575 public LSL_String llList2CSV(LSL_List src)
5610 { 5576 {
5611
5612 string ret = String.Empty;
5613 int x = 0;
5614
5615 m_host.AddScriptLPS(1); 5577 m_host.AddScriptLPS(1);
5616 5578
5617 if (src.Data.Length > 0) 5579 return string.Join(", ",
5618 { 5580 (new List<object>(src.Data)).ConvertAll<string>(o =>
5619 ret = src.Data[x++].ToString(); 5581 {
5620 for (; x < src.Data.Length; x++) 5582 return o.ToString();
5621 { 5583 }).ToArray());
5622 ret += ", "+src.Data[x].ToString();
5623 }
5624 }
5625
5626 return ret;
5627 } 5584 }
5628 5585
5629 /// <summary> 5586 /// <summary>
@@ -6296,19 +6253,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6296 m_host.AddScriptLPS(1); 6253 m_host.AddScriptLPS(1);
6297 6254
6298 List<SceneObjectPart> parts = GetLinkParts(linknumber); 6255 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6299 if (parts.Count > 0) 6256
6257 try
6300 { 6258 {
6301 try 6259 foreach (SceneObjectPart part in parts)
6302 {
6303 foreach (var part in parts)
6304 {
6305 SetTextureAnim(part, mode, face, sizex, sizey, start, length, rate);
6306 }
6307 }
6308 finally
6309 { 6260 {
6261 SetTextureAnim(part, mode, face, sizex, sizey, start, length, rate);
6310 } 6262 }
6311 } 6263 }
6264 finally
6265 {
6266 }
6312 } 6267 }
6313 6268
6314 private void SetTextureAnim(SceneObjectPart part, int mode, int face, int sizex, int sizey, double start, double length, double rate) 6269 private void SetTextureAnim(SceneObjectPart part, int mode, int face, int sizex, int sizey, double start, double length, double rate)
@@ -6526,9 +6481,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6526 6481
6527 //Plug the x,y coordinates of the slope normal into the equation of the plane to get 6482 //Plug the x,y coordinates of the slope normal into the equation of the plane to get
6528 //the height of that point on the plane. The resulting vector gives the slope. 6483 //the height of that point on the plane. The resulting vector gives the slope.
6529 Vector3 vsl = new Vector3(); 6484 Vector3 vsl = vsn;
6530 vsl.X = (float)vsn.x;
6531 vsl.Y = (float)vsn.y;
6532 vsl.Z = (float)(((vsn.x * vsn.x) + (vsn.y * vsn.y)) / (-1 * vsn.z)); 6485 vsl.Z = (float)(((vsn.x * vsn.x) + (vsn.y * vsn.y)) / (-1 * vsn.z));
6533 vsl.Normalize(); 6486 vsl.Normalize();
6534 //Normalization might be overkill here 6487 //Normalization might be overkill here
@@ -6539,9 +6492,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6539 public LSL_Vector llGroundNormal(LSL_Vector offset) 6492 public LSL_Vector llGroundNormal(LSL_Vector offset)
6540 { 6493 {
6541 m_host.AddScriptLPS(1); 6494 m_host.AddScriptLPS(1);
6542 Vector3 pos = m_host.GetWorldPosition() + new Vector3((float)offset.x, 6495 Vector3 pos = m_host.GetWorldPosition() + (Vector3)offset;
6543 (float)offset.y,
6544 (float)offset.z);
6545 // Clamp to valid position 6496 // Clamp to valid position
6546 if (pos.X < 0) 6497 if (pos.X < 0)
6547 pos.X = 0; 6498 pos.X = 0;
@@ -6706,7 +6657,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6706 6657
6707 List<SceneObjectPart> parts = GetLinkParts(linknumber); 6658 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6708 6659
6709 foreach (var part in parts) 6660 foreach (SceneObjectPart part in parts)
6710 { 6661 {
6711 SetParticleSystem(part, rules); 6662 SetParticleSystem(part, rules);
6712 } 6663 }
@@ -6995,8 +6946,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6995 6946
6996 if (!m_host.ParentGroup.IsDeleted) 6947 if (!m_host.ParentGroup.IsDeleted)
6997 { 6948 {
6998 m_host.ParentGroup.RootPart.SetVehicleVectorParam(param, 6949 m_host.ParentGroup.RootPart.SetVehicleVectorParam(param, vec);
6999 new Vector3((float)vec.x, (float)vec.y, (float)vec.z));
7000 } 6950 }
7001 } 6951 }
7002 6952
@@ -7008,7 +6958,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7008 6958
7009 if (!m_host.ParentGroup.IsDeleted) 6959 if (!m_host.ParentGroup.IsDeleted)
7010 { 6960 {
7011 m_host.ParentGroup.RootPart.SetVehicleRotationParam(param, Rot2Quaternion(rot)); 6961 m_host.ParentGroup.RootPart.SetVehicleRotationParam(param, rot);
7012 } 6962 }
7013 } 6963 }
7014 6964
@@ -7038,8 +6988,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7038 if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) 6988 if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0)
7039 rot.s = 1; // ZERO_ROTATION = 0,0,0,1 6989 rot.s = 1; // ZERO_ROTATION = 0,0,0,1
7040 6990
7041 part.SitTargetPosition = new Vector3((float)offset.x, (float)offset.y, (float)offset.z); 6991 part.SitTargetPosition = offset;
7042 part.SitTargetOrientation = Rot2Quaternion(rot); 6992 part.SitTargetOrientation = rot;
7043 part.ParentGroup.HasGroupChanged = true; 6993 part.ParentGroup.HasGroupChanged = true;
7044 } 6994 }
7045 6995
@@ -7142,13 +7092,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7142 public void llSetCameraEyeOffset(LSL_Vector offset) 7092 public void llSetCameraEyeOffset(LSL_Vector offset)
7143 { 7093 {
7144 m_host.AddScriptLPS(1); 7094 m_host.AddScriptLPS(1);
7145 m_host.SetCameraEyeOffset(new Vector3((float)offset.x, (float)offset.y, (float)offset.z)); 7095 m_host.SetCameraEyeOffset(offset);
7146 } 7096 }
7147 7097
7148 public void llSetCameraAtOffset(LSL_Vector offset) 7098 public void llSetCameraAtOffset(LSL_Vector offset)
7149 { 7099 {
7150 m_host.AddScriptLPS(1); 7100 m_host.AddScriptLPS(1);
7151 m_host.SetCameraAtOffset(new Vector3((float)offset.x, (float)offset.y, (float)offset.z)); 7101 m_host.SetCameraAtOffset(offset);
7152 } 7102 }
7153 7103
7154 public LSL_String llDumpList2String(LSL_List src, string seperator) 7104 public LSL_String llDumpList2String(LSL_List src, string seperator)
@@ -7170,7 +7120,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7170 public LSL_Integer llScriptDanger(LSL_Vector pos) 7120 public LSL_Integer llScriptDanger(LSL_Vector pos)
7171 { 7121 {
7172 m_host.AddScriptLPS(1); 7122 m_host.AddScriptLPS(1);
7173 bool result = World.ScriptDanger(m_host.LocalId, new Vector3((float)pos.x, (float)pos.y, (float)pos.z)); 7123 bool result = World.ScriptDanger(m_host.LocalId, pos);
7174 if (result) 7124 if (result)
7175 { 7125 {
7176 return 1; 7126 return 1;
@@ -7752,7 +7702,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7752 { 7702 {
7753 m_host.AddScriptLPS(1); 7703 m_host.AddScriptLPS(1);
7754 7704
7755 setLinkPrimParams(ScriptBaseClass.LINK_THIS, rules); 7705 setLinkPrimParams(ScriptBaseClass.LINK_THIS, rules, "llSetPrimitiveParams");
7756 7706
7757 ScriptSleep(200); 7707 ScriptSleep(200);
7758 } 7708 }
@@ -7761,10 +7711,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7761 { 7711 {
7762 m_host.AddScriptLPS(1); 7712 m_host.AddScriptLPS(1);
7763 7713
7764 setLinkPrimParams(linknumber, rules); 7714 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParamsFast");
7715
7716 ScriptSleep(200);
7765 } 7717 }
7766 7718
7767 private void setLinkPrimParams(int linknumber, LSL_List rules) 7719 private void setLinkPrimParams(int linknumber, LSL_List rules, string originFunc)
7768 { 7720 {
7769 List<object> parts = new List<object>(); 7721 List<object> parts = new List<object>();
7770 List<SceneObjectPart> prims = GetLinkParts(linknumber); 7722 List<SceneObjectPart> prims = GetLinkParts(linknumber);
@@ -7775,15 +7727,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7775 parts.Add(p); 7727 parts.Add(p);
7776 7728
7777 LSL_List remaining = null; 7729 LSL_List remaining = null;
7730 uint rulesParsed = 0;
7778 7731
7779 if (parts.Count > 0) 7732 if (parts.Count > 0)
7780 { 7733 {
7781 foreach (object part in parts) 7734 foreach (object part in parts)
7782 { 7735 {
7783 if (part is SceneObjectPart) 7736 if (part is SceneObjectPart)
7784 remaining = SetPrimParams((SceneObjectPart)part, rules); 7737 remaining = SetPrimParams((SceneObjectPart)part, rules, originFunc, ref rulesParsed);
7785 else 7738 else
7786 remaining = SetPrimParams((ScenePresence)part, rules); 7739 remaining = SetPrimParams((ScenePresence)part, rules, originFunc, ref rulesParsed);
7787 } 7740 }
7788 7741
7789 while ((object)remaining != null && remaining.Length > 2) 7742 while ((object)remaining != null && remaining.Length > 2)
@@ -7802,9 +7755,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7802 foreach (object part in parts) 7755 foreach (object part in parts)
7803 { 7756 {
7804 if (part is SceneObjectPart) 7757 if (part is SceneObjectPart)
7805 remaining = SetPrimParams((SceneObjectPart)part, rules); 7758 remaining = SetPrimParams((SceneObjectPart)part, rules, originFunc, ref rulesParsed);
7806 else 7759 else
7807 remaining = SetPrimParams((ScenePresence)part, rules); 7760 remaining = SetPrimParams((ScenePresence)part, rules, originFunc, ref rulesParsed);
7808 } 7761 }
7809 } 7762 }
7810 } 7763 }
@@ -7842,6 +7795,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7842 7795
7843 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) 7796 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
7844 { 7797 {
7798 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParams");
7845 llSetLinkPrimitiveParamsFast(linknumber, rules); 7799 llSetLinkPrimitiveParamsFast(linknumber, rules);
7846 ScriptSleep(200); 7800 ScriptSleep(200);
7847 } 7801 }
@@ -7869,195 +7823,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7869 return new Vector3((float)x, (float)y, (float)z); 7823 return new Vector3((float)x, (float)y, (float)z);
7870 } 7824 }
7871 7825
7872 protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules) 7826 protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed)
7873 {
7874 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset.
7875
7876 int idx = 0;
7877
7878 bool positionChanged = false;
7879 Vector3 finalPos = Vector3.Zero;
7880
7881 try
7882 {
7883 while (idx < rules.Length)
7884 {
7885 int code = rules.GetLSLIntegerItem(idx++);
7886
7887 int remain = rules.Length - idx;
7888
7889 switch (code)
7890 {
7891 case (int)ScriptBaseClass.PRIM_POSITION:
7892 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
7893 {
7894 if (remain < 1)
7895 return null;
7896
7897 LSL_Vector v;
7898 v = rules.GetVector3Item(idx++);
7899
7900 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
7901 if (part == null)
7902 break;
7903
7904 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
7905 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
7906 if (part.LinkNum > 1)
7907 {
7908 localRot = GetPartLocalRot(part);
7909 localPos = GetPartLocalPos(part);
7910 }
7911
7912 v -= localPos;
7913 v /= localRot;
7914
7915 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f);
7916
7917 v = v + 2 * sitOffset;
7918
7919 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
7920 av.SendAvatarDataToAllAgents();
7921
7922 }
7923 break;
7924
7925 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
7926 case (int)ScriptBaseClass.PRIM_ROTATION:
7927 {
7928 if (remain < 1)
7929 return null;
7930
7931 LSL_Rotation r;
7932 r = rules.GetQuaternionItem(idx++);
7933
7934 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
7935 if (part == null)
7936 break;
7937
7938 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
7939 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
7940
7941 if (part.LinkNum > 1)
7942 localRot = GetPartLocalRot(part);
7943
7944 r = r * llGetRootRotation() / localRot;
7945 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
7946 av.SendAvatarDataToAllAgents();
7947 }
7948 break;
7949
7950 // parse rest doing nothing but number of parameters error check
7951 case (int)ScriptBaseClass.PRIM_SIZE:
7952 case (int)ScriptBaseClass.PRIM_MATERIAL:
7953 case (int)ScriptBaseClass.PRIM_PHANTOM:
7954 case (int)ScriptBaseClass.PRIM_PHYSICS:
7955 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
7956 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
7957 case (int)ScriptBaseClass.PRIM_NAME:
7958 case (int)ScriptBaseClass.PRIM_DESC:
7959 if (remain < 1)
7960 return null;
7961 idx++;
7962 break;
7963
7964 case (int)ScriptBaseClass.PRIM_GLOW:
7965 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
7966 case (int)ScriptBaseClass.PRIM_TEXGEN:
7967 if (remain < 2)
7968 return null;
7969 idx += 2;
7970 break;
7971
7972 case (int)ScriptBaseClass.PRIM_TYPE:
7973 if (remain < 3)
7974 return null;
7975 code = (int)rules.GetLSLIntegerItem(idx++);
7976 remain = rules.Length - idx;
7977 switch (code)
7978 {
7979 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
7980 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
7981 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
7982 if (remain < 6)
7983 return null;
7984 idx += 6;
7985 break;
7986
7987 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
7988 if (remain < 5)
7989 return null;
7990 idx += 5;
7991 break;
7992
7993 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
7994 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
7995 case (int)ScriptBaseClass.PRIM_TYPE_RING:
7996 if (remain < 11)
7997 return null;
7998 idx += 11;
7999 break;
8000
8001 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
8002 if (remain < 2)
8003 return null;
8004 idx += 2;
8005 break;
8006 }
8007 break;
8008
8009 case (int)ScriptBaseClass.PRIM_COLOR:
8010 case (int)ScriptBaseClass.PRIM_TEXT:
8011 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
8012 case (int)ScriptBaseClass.PRIM_OMEGA:
8013 if (remain < 3)
8014 return null;
8015 idx += 3;
8016 break;
8017
8018 case (int)ScriptBaseClass.PRIM_TEXTURE:
8019 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
8020 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
8021 if (remain < 5)
8022 return null;
8023 idx += 5;
8024 break;
8025
8026 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
8027 if (remain < 7)
8028 return null;
8029
8030 idx += 7;
8031 break;
8032
8033 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8034 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8035 return null;
8036
8037 return rules.GetSublist(idx, -1);
8038 }
8039 }
8040 }
8041
8042 finally
8043 {
8044 if (positionChanged)
8045 {
8046 av.OffsetPosition = finalPos;
8047// av.SendAvatarDataToAllAgents();
8048 av.SendTerseUpdateToAllClients();
8049 positionChanged = false;
8050 }
8051 }
8052 return null;
8053 }
8054
8055 protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules)
8056 { 7827 {
8057 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 7828 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
8058 return null; 7829 return null;
8059 7830
8060 int idx = 0; 7831 int idx = 0;
7832 int idxStart = 0;
8061 7833
8062 SceneObjectGroup parentgrp = part.ParentGroup; 7834 SceneObjectGroup parentgrp = part.ParentGroup;
8063 7835
@@ -8068,9 +7840,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8068 { 7840 {
8069 while (idx < rules.Length) 7841 while (idx < rules.Length)
8070 { 7842 {
7843 ++rulesParsed;
8071 int code = rules.GetLSLIntegerItem(idx++); 7844 int code = rules.GetLSLIntegerItem(idx++);
8072 7845
8073 int remain = rules.Length - idx; 7846 int remain = rules.Length - idx;
7847 idxStart = idx;
8074 7848
8075 int face; 7849 int face;
8076 LSL_Vector v; 7850 LSL_Vector v;
@@ -8105,13 +7879,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8105 if (rootPart == part) 7879 if (rootPart == part)
8106 { 7880 {
8107 // special case: If we are root, rotate complete SOG to new rotation 7881 // special case: If we are root, rotate complete SOG to new rotation
8108 SetRot(part, Rot2Quaternion(q)); 7882 SetRot(part, q);
8109 } 7883 }
8110 else 7884 else
8111 { 7885 {
8112 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. 7886 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
8113 // sounds like sl bug that we need to replicate 7887 // sounds like sl bug that we need to replicate
8114 SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); 7888 SetRot(part, rootPart.RotationOffset * (Quaternion)q);
8115 } 7889 }
8116 7890
8117 break; 7891 break;
@@ -8285,8 +8059,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8285 LSL_Vector color=rules.GetVector3Item(idx++); 8059 LSL_Vector color=rules.GetVector3Item(idx++);
8286 double alpha=(double)rules.GetLSLFloatItem(idx++); 8060 double alpha=(double)rules.GetLSLFloatItem(idx++);
8287 8061
8288 part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); 8062 part.SetFaceColorAlpha(face, color, alpha);
8289 SetAlpha(part, alpha, face);
8290 8063
8291 break; 8064 break;
8292 8065
@@ -8434,9 +8207,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8434 string primText = rules.GetLSLStringItem(idx++); 8207 string primText = rules.GetLSLStringItem(idx++);
8435 LSL_Vector primTextColor = rules.GetVector3Item(idx++); 8208 LSL_Vector primTextColor = rules.GetVector3Item(idx++);
8436 LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); 8209 LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++);
8437 Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), 8210 Vector3 av3 = Util.Clip(primTextColor, 0.0f, 1.0f);
8438 Util.Clip((float)primTextColor.y, 0.0f, 1.0f),
8439 Util.Clip((float)primTextColor.z, 0.0f, 1.0f));
8440 part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f)); 8211 part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f));
8441 8212
8442 break; 8213 break;
@@ -8455,8 +8226,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8455 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 8226 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8456 if (remain < 1) 8227 if (remain < 1)
8457 return null; 8228 return null;
8458 LSL_Rotation lr = rules.GetQuaternionItem(idx++); 8229 SetRot(part, rules.GetQuaternionItem(idx++));
8459 SetRot(part, Rot2Quaternion(lr));
8460 break; 8230 break;
8461 case (int)ScriptBaseClass.PRIM_OMEGA: 8231 case (int)ScriptBaseClass.PRIM_OMEGA:
8462 if (remain < 3) 8232 if (remain < 3)
@@ -8466,7 +8236,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8466 LSL_Float gain = rules.GetLSLFloatItem(idx++); 8236 LSL_Float gain = rules.GetLSLFloatItem(idx++);
8467 TargetOmega(part, axis, (double)spinrate, (double)gain); 8237 TargetOmega(part, axis, (double)spinrate, (double)gain);
8468 break; 8238 break;
8469 8239 case (int)ScriptBaseClass.PRIM_SLICE:
8240 if (remain < 1)
8241 return null;
8242 LSL_Vector slice = rules.GetVector3Item(idx++);
8243 part.UpdateSlice((float)slice.x, (float)slice.y);
8244 break;
8470 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8245 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
8471 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 8246 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
8472 return null; 8247 return null;
@@ -8475,6 +8250,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8475 } 8250 }
8476 } 8251 }
8477 } 8252 }
8253 catch (InvalidCastException e)
8254 {
8255 ShoutError(string.Format(
8256 "{0} error running rule #{1}: arg #{2} ",
8257 originFunc, rulesParsed, idx - idxStart) + e.Message);
8258 }
8478 finally 8259 finally
8479 { 8260 {
8480 if (positionChanged) 8261 if (positionChanged)
@@ -8483,12 +8264,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8483 { 8264 {
8484 SceneObjectGroup parent = part.ParentGroup; 8265 SceneObjectGroup parent = part.ParentGroup;
8485 Util.FireAndForget(delegate(object x) { 8266 Util.FireAndForget(delegate(object x) {
8486 parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); 8267 parent.UpdateGroupPosition(currentPosition);
8487 }); 8268 });
8488 } 8269 }
8489 else 8270 else
8490 { 8271 {
8491 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); 8272 part.OffsetPosition = currentPosition;
8492 SceneObjectGroup parent = part.ParentGroup; 8273 SceneObjectGroup parent = part.ParentGroup;
8493 parent.HasGroupChanged = true; 8274 parent.HasGroupChanged = true;
8494 parent.ScheduleGroupForTerseUpdate(); 8275 parent.ScheduleGroupForTerseUpdate();
@@ -8866,7 +8647,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8866 public LSL_List llGetPrimitiveParams(LSL_List rules) 8647 public LSL_List llGetPrimitiveParams(LSL_List rules)
8867 { 8648 {
8868 m_host.AddScriptLPS(1); 8649 m_host.AddScriptLPS(1);
8869 return GetLinkPrimitiveParams(m_host, rules); 8650
8651 LSL_List result = new LSL_List();
8652
8653 LSL_List remaining = GetPrimParams(m_host, rules, ref result);
8654
8655 while (remaining != null && remaining.Length > 2)
8656 {
8657 int linknumber = remaining.GetLSLIntegerItem(0);
8658 rules = remaining.GetSublist(1, -1);
8659 List<SceneObjectPart> parts = GetLinkParts(linknumber);
8660
8661 foreach (SceneObjectPart part in parts)
8662 remaining = GetPrimParams(part, rules, ref result);
8663 }
8664
8665 return result;
8870 } 8666 }
8871 8667
8872 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules) 8668 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules)
@@ -8876,294 +8672,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8876 // acording to SL wiki this must indicate a single link number or link_root or link_this. 8672 // acording to SL wiki this must indicate a single link number or link_root or link_this.
8877 // keep other options as before 8673 // keep other options as before
8878 8674
8879 List<SceneObjectPart> parts = GetLinkParts(linknumber); 8675 List<SceneObjectPart> parts;
8880 List<ScenePresence> avatars = GetLinkAvatars(linknumber); 8676 List<ScenePresence> avatars;
8881 8677
8882 LSL_List res = new LSL_List(); 8678 LSL_List res = new LSL_List();
8679 LSL_List remaining = null;
8883 8680
8884 if (parts.Count > 0) 8681 while (rules.Length > 0)
8885 { 8682 {
8886 foreach (var part in parts) 8683 parts = GetLinkParts(linknumber);
8684 avatars = GetLinkAvatars(linknumber);
8685
8686 remaining = null;
8687 foreach (SceneObjectPart part in parts)
8887 { 8688 {
8888 LSL_List partRes = GetLinkPrimitiveParams(part, rules); 8689 remaining = GetPrimParams(part, rules, ref res);
8889 res += partRes;
8890 } 8690 }
8891 }
8892 if (avatars.Count > 0)
8893 {
8894 foreach (ScenePresence avatar in avatars) 8691 foreach (ScenePresence avatar in avatars)
8895 { 8692 {
8896 LSL_List avaRes = GetLinkPrimitiveParams(avatar, rules); 8693 remaining = GetPrimParams(avatar, rules, ref res);
8897 res += avaRes;
8898 } 8694 }
8899 }
8900 return res;
8901 }
8902
8903 public LSL_List GetLinkPrimitiveParams(ScenePresence avatar, LSL_List rules)
8904 {
8905 // avatars case
8906 // replies as SL wiki
8907
8908 LSL_List res = new LSL_List();
8909// SceneObjectPart sitPart = avatar.ParentPart; // most likelly it will be needed
8910 SceneObjectPart sitPart = World.GetSceneObjectPart(avatar.ParentID); // maybe better do this expensive search for it in case it's gone??
8911 8695
8912 int idx = 0; 8696 if (remaining != null && remaining.Length > 0)
8913 while (idx < rules.Length)
8914 {
8915 int code = (int)rules.GetLSLIntegerItem(idx++);
8916 int remain = rules.Length - idx;
8917
8918 switch (code)
8919 { 8697 {
8920 case (int)ScriptBaseClass.PRIM_MATERIAL: 8698 linknumber = remaining.GetLSLIntegerItem(0);
8921 res.Add(new LSL_Integer((int)SOPMaterialData.SopMaterial.Flesh)); 8699 rules = remaining.GetSublist(1, -1);
8922 break;
8923
8924 case (int)ScriptBaseClass.PRIM_PHYSICS:
8925 res.Add(new LSL_Integer(0));
8926 break;
8927
8928 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
8929 res.Add(new LSL_Integer(0));
8930 break;
8931
8932 case (int)ScriptBaseClass.PRIM_PHANTOM:
8933 res.Add(new LSL_Integer(0));
8934 break;
8935
8936 case (int)ScriptBaseClass.PRIM_POSITION:
8937
8938 Vector3 pos = avatar.OffsetPosition;
8939
8940 Vector3 sitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f *2.0f);
8941 pos -= sitOffset;
8942
8943 if( sitPart != null)
8944 pos = sitPart.GetWorldPosition() + pos * sitPart.GetWorldRotation();
8945
8946 res.Add(new LSL_Vector(pos.X,pos.Y,pos.Z));
8947 break;
8948
8949 case (int)ScriptBaseClass.PRIM_SIZE:
8950 // as in llGetAgentSize above
8951 res.Add(new LSL_Vector(0.45f, 0.6f, avatar.Appearance.AvatarHeight));
8952 break;
8953
8954 case (int)ScriptBaseClass.PRIM_ROTATION:
8955 Quaternion rot = avatar.Rotation;
8956 if (sitPart != null)
8957 {
8958 rot = sitPart.GetWorldRotation() * rot; // apply sit part world rotation
8959 }
8960
8961 res.Add(new LSL_Rotation (rot.X, rot.Y, rot.Z, rot.W));
8962 break;
8963
8964 case (int)ScriptBaseClass.PRIM_TYPE:
8965 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX));
8966 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT));
8967 res.Add(new LSL_Vector(0f,1.0f,0f));
8968 res.Add(new LSL_Float(0.0f));
8969 res.Add(new LSL_Vector(0, 0, 0));
8970 res.Add(new LSL_Vector(1.0f,1.0f,0f));
8971 res.Add(new LSL_Vector(0, 0, 0));
8972 break;
8973
8974 case (int)ScriptBaseClass.PRIM_TEXTURE:
8975 if (remain < 1)
8976 return res;
8977
8978 int face = (int)rules.GetLSLIntegerItem(idx++);
8979 if (face == ScriptBaseClass.ALL_SIDES)
8980 {
8981 for (face = 0; face < 21; face++)
8982 {
8983 res.Add(new LSL_String(""));
8984 res.Add(new LSL_Vector(0,0,0));
8985 res.Add(new LSL_Vector(0,0,0));
8986 res.Add(new LSL_Float(0.0));
8987 }
8988 }
8989 else
8990 {
8991 if (face >= 0 && face < 21)
8992 {
8993 res.Add(new LSL_String(""));
8994 res.Add(new LSL_Vector(0,0,0));
8995 res.Add(new LSL_Vector(0,0,0));
8996 res.Add(new LSL_Float(0.0));
8997 }
8998 }
8999 break;
9000
9001 case (int)ScriptBaseClass.PRIM_COLOR:
9002 if (remain < 1)
9003 return res;
9004
9005 face = (int)rules.GetLSLIntegerItem(idx++);
9006
9007 if (face == ScriptBaseClass.ALL_SIDES)
9008 {
9009 for (face = 0; face < 21; face++)
9010 {
9011 res.Add(new LSL_Vector(0,0,0));
9012 res.Add(new LSL_Float(0));
9013 }
9014 }
9015 else
9016 {
9017 res.Add(new LSL_Vector(0,0,0));
9018 res.Add(new LSL_Float(0));
9019 }
9020 break;
9021
9022 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
9023 if (remain < 1)
9024 return res;
9025 face = (int)rules.GetLSLIntegerItem(idx++);
9026
9027 if (face == ScriptBaseClass.ALL_SIDES)
9028 {
9029 for (face = 0; face < 21; face++)
9030 {
9031 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
9032 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
9033 }
9034 }
9035 else
9036 {
9037 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
9038 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
9039 }
9040 break;
9041
9042 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
9043 if (remain < 1)
9044 return res;
9045 face = (int)rules.GetLSLIntegerItem(idx++);
9046
9047 if (face == ScriptBaseClass.ALL_SIDES)
9048 {
9049 for (face = 0; face < 21; face++)
9050 {
9051 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
9052 }
9053 }
9054 else
9055 {
9056 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
9057 }
9058 break;
9059
9060 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
9061 res.Add(new LSL_Integer(0));
9062 res.Add(new LSL_Integer(0));// softness
9063 res.Add(new LSL_Float(0.0f)); // gravity
9064 res.Add(new LSL_Float(0.0f)); // friction
9065 res.Add(new LSL_Float(0.0f)); // wind
9066 res.Add(new LSL_Float(0.0f)); // tension
9067 res.Add(new LSL_Vector(0f,0f,0f));
9068 break;
9069
9070 case (int)ScriptBaseClass.PRIM_TEXGEN:
9071 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
9072 if (remain < 1)
9073 return res;
9074 face = (int)rules.GetLSLIntegerItem(idx++);
9075
9076 if (face == ScriptBaseClass.ALL_SIDES)
9077 {
9078 for (face = 0; face < 21; face++)
9079 {
9080 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
9081 }
9082 }
9083 else
9084 {
9085 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
9086 }
9087 break;
9088
9089 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
9090 res.Add(new LSL_Integer(0));
9091 res.Add(new LSL_Vector(0f,0f,0f));
9092 res.Add(new LSL_Float(0f)); // intensity
9093 res.Add(new LSL_Float(0f)); // radius
9094 res.Add(new LSL_Float(0f)); // falloff
9095 break;
9096
9097 case (int)ScriptBaseClass.PRIM_GLOW:
9098 if (remain < 1)
9099 return res;
9100 face = (int)rules.GetLSLIntegerItem(idx++);
9101
9102 if (face == ScriptBaseClass.ALL_SIDES)
9103 {
9104 for (face = 0; face < 21; face++)
9105 {
9106 res.Add(new LSL_Float(0f));
9107 }
9108 }
9109 else
9110 {
9111 res.Add(new LSL_Float(0f));
9112 }
9113 break;
9114
9115 case (int)ScriptBaseClass.PRIM_TEXT:
9116 res.Add(new LSL_String(""));
9117 res.Add(new LSL_Vector(0f,0f,0f));
9118 res.Add(new LSL_Float(1.0f));
9119 break;
9120
9121 case (int)ScriptBaseClass.PRIM_NAME:
9122 res.Add(new LSL_String(avatar.Name));
9123 break;
9124
9125 case (int)ScriptBaseClass.PRIM_DESC:
9126 res.Add(new LSL_String(""));
9127 break;
9128
9129 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
9130 Quaternion lrot = avatar.Rotation;
9131
9132 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
9133 {
9134 lrot = sitPart.RotationOffset * lrot; // apply sit part rotation offset
9135 }
9136 res.Add(new LSL_Rotation(lrot.X, lrot.Y, lrot.Z, lrot.W));
9137 break;
9138
9139 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
9140 Vector3 lpos = avatar.OffsetPosition; // pos relative to sit part
9141 Vector3 lsitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f * 2.0f);
9142 lpos -= lsitOffset;
9143
9144 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
9145 {
9146 lpos = sitPart.OffsetPosition + (lpos * sitPart.RotationOffset); // make it relative to root prim
9147 }
9148 res.Add(new LSL_Vector(lpos.X,lpos.Y,lpos.Z));
9149 break;
9150
9151 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
9152 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
9153 return res;
9154 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++);
9155 LSL_List new_rules = rules.GetSublist(idx, -1);
9156
9157 res += llGetLinkPrimitiveParams((int)new_linknumber, new_rules);
9158 return res;
9159 } 8700 }
9160 } 8701 }
8702
9161 return res; 8703 return res;
9162 } 8704 }
9163 8705
9164 public LSL_List GetLinkPrimitiveParams(SceneObjectPart part, LSL_List rules) 8706 public LSL_List GetPrimParams(SceneObjectPart part, LSL_List rules, ref LSL_List res)
9165 { 8707 {
9166 LSL_List res = new LSL_List();
9167 int idx=0; 8708 int idx=0;
9168 while (idx < rules.Length) 8709 while (idx < rules.Length)
9169 { 8710 {
@@ -9301,7 +8842,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9301 8842
9302 case (int)ScriptBaseClass.PRIM_TEXTURE: 8843 case (int)ScriptBaseClass.PRIM_TEXTURE:
9303 if (remain < 1) 8844 if (remain < 1)
9304 return res; 8845 return null;
9305 8846
9306 int face = (int)rules.GetLSLIntegerItem(idx++); 8847 int face = (int)rules.GetLSLIntegerItem(idx++);
9307 Primitive.TextureEntry tex = part.Shape.Textures; 8848 Primitive.TextureEntry tex = part.Shape.Textures;
@@ -9341,7 +8882,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9341 8882
9342 case (int)ScriptBaseClass.PRIM_COLOR: 8883 case (int)ScriptBaseClass.PRIM_COLOR:
9343 if (remain < 1) 8884 if (remain < 1)
9344 return res; 8885 return null;
9345 8886
9346 face=(int)rules.GetLSLIntegerItem(idx++); 8887 face=(int)rules.GetLSLIntegerItem(idx++);
9347 8888
@@ -9370,7 +8911,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9370 8911
9371 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 8912 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
9372 if (remain < 1) 8913 if (remain < 1)
9373 return res; 8914 return null;
8915
9374 face = (int)rules.GetLSLIntegerItem(idx++); 8916 face = (int)rules.GetLSLIntegerItem(idx++);
9375 8917
9376 tex = part.Shape.Textures; 8918 tex = part.Shape.Textures;
@@ -9426,7 +8968,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9426 8968
9427 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 8969 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
9428 if (remain < 1) 8970 if (remain < 1)
9429 return res; 8971 return null;
8972
9430 face = (int)rules.GetLSLIntegerItem(idx++); 8973 face = (int)rules.GetLSLIntegerItem(idx++);
9431 8974
9432 tex = part.Shape.Textures; 8975 tex = part.Shape.Textures;
@@ -9480,7 +9023,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9480 case (int)ScriptBaseClass.PRIM_TEXGEN: 9023 case (int)ScriptBaseClass.PRIM_TEXGEN:
9481 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR) 9024 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
9482 if (remain < 1) 9025 if (remain < 1)
9483 return res; 9026 return null;
9027
9484 face = (int)rules.GetLSLIntegerItem(idx++); 9028 face = (int)rules.GetLSLIntegerItem(idx++);
9485 9029
9486 tex = part.Shape.Textures; 9030 tex = part.Shape.Textures;
@@ -9528,7 +9072,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9528 9072
9529 case (int)ScriptBaseClass.PRIM_GLOW: 9073 case (int)ScriptBaseClass.PRIM_GLOW:
9530 if (remain < 1) 9074 if (remain < 1)
9531 return res; 9075 return null;
9076
9532 face = (int)rules.GetLSLIntegerItem(idx++); 9077 face = (int)rules.GetLSLIntegerItem(idx++);
9533 9078
9534 tex = part.Shape.Textures; 9079 tex = part.Shape.Textures;
@@ -9572,18 +9117,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9572 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 9117 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
9573 res.Add(new LSL_Vector(GetPartLocalPos(part))); 9118 res.Add(new LSL_Vector(GetPartLocalPos(part)));
9574 break; 9119 break;
9575 9120 case (int)ScriptBaseClass.PRIM_SLICE:
9121 PrimType prim_type = part.GetPrimType();
9122 bool useProfileBeginEnd = (prim_type == PrimType.SPHERE || prim_type == PrimType.TORUS || prim_type == PrimType.TUBE || prim_type == PrimType.RING);
9123 res.Add(new LSL_Vector(
9124 (useProfileBeginEnd ? part.Shape.ProfileBegin : part.Shape.PathBegin) / 50000.0,
9125 1 - (useProfileBeginEnd ? part.Shape.ProfileEnd : part.Shape.PathEnd) / 50000.0,
9126 0
9127 ));
9128 break;
9576 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 9129 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
9577 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless. 9130 if(remain < 3)
9578 return res; 9131 return null;
9579 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 9132
9580 LSL_List new_rules = rules.GetSublist(idx, -1); 9133 return rules.GetSublist(idx, -1);
9581 LSL_List tres = llGetLinkPrimitiveParams((int)new_linknumber, new_rules);
9582 res += tres;
9583 return res;
9584 } 9134 }
9585 } 9135 }
9586 return res; 9136
9137 return null;
9587 } 9138 }
9588 9139
9589 public LSL_List llGetPrimMediaParams(int face, LSL_List rules) 9140 public LSL_List llGetPrimMediaParams(int face, LSL_List rules)
@@ -11166,9 +10717,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11166 ScenePresence avatar = World.GetScenePresence(detectedParams.Key); 10717 ScenePresence avatar = World.GetScenePresence(detectedParams.Key);
11167 if (avatar != null) 10718 if (avatar != null)
11168 { 10719 {
11169 avatar.ControllingClient.SendScriptTeleportRequest(m_host.Name, simname, 10720 avatar.ControllingClient.SendScriptTeleportRequest(m_host.Name,
11170 new Vector3((float)pos.x, (float)pos.y, (float)pos.z), 10721 simname, pos, lookAt);
11171 new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z));
11172 } 10722 }
11173 10723
11174 ScriptSleep(1000); 10724 ScriptSleep(1000);
@@ -11903,13 +11453,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11903 else 11453 else
11904 rot = obj.GetWorldRotation(); 11454 rot = obj.GetWorldRotation();
11905 11455
11906 LSL_Rotation objrot = new LSL_Rotation(rot.X, rot.Y, rot.Z, rot.W); 11456 LSL_Rotation objrot = new LSL_Rotation(rot);
11907 ret.Add(objrot); 11457 ret.Add(objrot);
11908 } 11458 }
11909 break; 11459 break;
11910 case ScriptBaseClass.OBJECT_VELOCITY: 11460 case ScriptBaseClass.OBJECT_VELOCITY:
11911 Vector3 ovel = obj.Velocity; 11461 ret.Add(new LSL_Vector(obj.Velocity));
11912 ret.Add(new LSL_Vector(ovel.X, ovel.Y, ovel.Z));
11913 break; 11462 break;
11914 case ScriptBaseClass.OBJECT_OWNER: 11463 case ScriptBaseClass.OBJECT_OWNER:
11915 ret.Add(new LSL_String(obj.OwnerID.ToString())); 11464 ret.Add(new LSL_String(obj.OwnerID.ToString()));
@@ -12122,7 +11671,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12122 return tid.ToString(); 11671 return tid.ToString();
12123 } 11672 }
12124 11673
12125 public void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules) 11674 public void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc)
12126 { 11675 {
12127 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim)); 11676 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim));
12128 if (obj == null) 11677 if (obj == null)
@@ -12131,28 +11680,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12131 if (obj.OwnerID != m_host.OwnerID) 11680 if (obj.OwnerID != m_host.OwnerID)
12132 return; 11681 return;
12133 11682
12134 LSL_List remaining = SetPrimParams(obj, rules); 11683 uint rulesParsed = 0;
11684 LSL_List remaining = SetPrimParams(obj, rules, originFunc, ref rulesParsed);
12135 11685
12136 while ((object)remaining != null && remaining.Length > 2) 11686 while ((object)remaining != null && remaining.Length > 2)
12137 { 11687 {
12138 LSL_Integer newLink = remaining.GetLSLIntegerItem(0); 11688 LSL_Integer newLink = remaining.GetLSLIntegerItem(0);
12139 LSL_List newrules = remaining.GetSublist(1, -1); 11689 LSL_List newrules = remaining.GetSublist(1, -1);
12140 foreach(SceneObjectPart part in GetLinkParts(obj, newLink)){ 11690 foreach(SceneObjectPart part in GetLinkParts(obj, newLink)){
12141 remaining = SetPrimParams(part, newrules); 11691 remaining = SetPrimParams(part, newrules, originFunc, ref rulesParsed);
12142 } 11692 }
12143 } 11693 }
12144 } 11694 }
12145 11695
12146 public LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules) 11696 public LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules)
12147 { 11697 {
12148 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim)); 11698 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim));
12149 if (obj == null)
12150 return new LSL_List();
12151 11699
12152 if (obj.OwnerID != m_host.OwnerID) 11700 LSL_List result = new LSL_List();
12153 return new LSL_List(); 11701
11702 if (obj != null && obj.OwnerID != m_host.OwnerID)
11703 {
11704 LSL_List remaining = GetPrimParams(obj, rules, ref result);
12154 11705
12155 return GetLinkPrimitiveParams(obj, rules); 11706 while (remaining != null && remaining.Length > 2)
11707 {
11708 int linknumber = remaining.GetLSLIntegerItem(0);
11709 rules = remaining.GetSublist(1, -1);
11710 List<SceneObjectPart> parts = GetLinkParts(linknumber);
11711
11712 foreach (SceneObjectPart part in parts)
11713 remaining = GetPrimParams(part, rules, ref result);
11714 }
11715 }
11716
11717 return result;
12156 } 11718 }
12157 11719
12158 public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link) 11720 public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
@@ -12515,8 +12077,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12515 12077
12516 m_host.AddScriptLPS(1); 12078 m_host.AddScriptLPS(1);
12517 12079
12518 Vector3 rayStart = new Vector3((float)start.x, (float)start.y, (float)start.z); 12080 Vector3 rayStart = start;
12519 Vector3 rayEnd = new Vector3((float)end.x, (float)end.y, (float)end.z); 12081 Vector3 rayEnd = end;
12520 Vector3 dir = rayEnd - rayStart; 12082 Vector3 dir = rayEnd - rayStart;
12521 12083
12522 float dist = Vector3.Mag(dir); 12084 float dist = Vector3.Mag(dir);
@@ -13090,6 +12652,455 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13090 } 12652 }
13091 } 12653 }
13092 } 12654 }
12655
12656 protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed)
12657 {
12658 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset.
12659
12660 int idx = 0;
12661 int idxStart = 0;
12662
12663 bool positionChanged = false;
12664 Vector3 finalPos = Vector3.Zero;
12665
12666 try
12667 {
12668 while (idx < rules.Length)
12669 {
12670 ++rulesParsed;
12671 int code = rules.GetLSLIntegerItem(idx++);
12672
12673 int remain = rules.Length - idx;
12674 idxStart = idx;
12675
12676 switch (code)
12677 {
12678 case (int)ScriptBaseClass.PRIM_POSITION:
12679 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
12680 {
12681 if (remain < 1)
12682 return null;
12683
12684 LSL_Vector v;
12685 v = rules.GetVector3Item(idx++);
12686
12687 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
12688 if (part == null)
12689 break;
12690
12691 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
12692 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
12693 if (part.LinkNum > 1)
12694 {
12695 localRot = GetPartLocalRot(part);
12696 localPos = GetPartLocalPos(part);
12697 }
12698
12699 v -= localPos;
12700 v /= localRot;
12701
12702 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f);
12703
12704 v = v + 2 * sitOffset;
12705
12706 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
12707 av.SendAvatarDataToAllAgents();
12708
12709 }
12710 break;
12711
12712 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
12713 case (int)ScriptBaseClass.PRIM_ROTATION:
12714 {
12715 if (remain < 1)
12716 return null;
12717
12718 LSL_Rotation r;
12719 r = rules.GetQuaternionItem(idx++);
12720
12721 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
12722 if (part == null)
12723 break;
12724
12725 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
12726 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
12727
12728 if (part.LinkNum > 1)
12729 localRot = GetPartLocalRot(part);
12730
12731 r = r * llGetRootRotation() / localRot;
12732 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
12733 av.SendAvatarDataToAllAgents();
12734 }
12735 break;
12736
12737 // parse rest doing nothing but number of parameters error check
12738 case (int)ScriptBaseClass.PRIM_SIZE:
12739 case (int)ScriptBaseClass.PRIM_MATERIAL:
12740 case (int)ScriptBaseClass.PRIM_PHANTOM:
12741 case (int)ScriptBaseClass.PRIM_PHYSICS:
12742 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
12743 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
12744 case (int)ScriptBaseClass.PRIM_NAME:
12745 case (int)ScriptBaseClass.PRIM_DESC:
12746 if (remain < 1)
12747 return null;
12748 idx++;
12749 break;
12750
12751 case (int)ScriptBaseClass.PRIM_GLOW:
12752 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
12753 case (int)ScriptBaseClass.PRIM_TEXGEN:
12754 if (remain < 2)
12755 return null;
12756 idx += 2;
12757 break;
12758
12759 case (int)ScriptBaseClass.PRIM_TYPE:
12760 if (remain < 3)
12761 return null;
12762 code = (int)rules.GetLSLIntegerItem(idx++);
12763 remain = rules.Length - idx;
12764 switch (code)
12765 {
12766 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
12767 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
12768 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
12769 if (remain < 6)
12770 return null;
12771 idx += 6;
12772 break;
12773
12774 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
12775 if (remain < 5)
12776 return null;
12777 idx += 5;
12778 break;
12779
12780 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
12781 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
12782 case (int)ScriptBaseClass.PRIM_TYPE_RING:
12783 if (remain < 11)
12784 return null;
12785 idx += 11;
12786 break;
12787
12788 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
12789 if (remain < 2)
12790 return null;
12791 idx += 2;
12792 break;
12793 }
12794 break;
12795
12796 case (int)ScriptBaseClass.PRIM_COLOR:
12797 case (int)ScriptBaseClass.PRIM_TEXT:
12798 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
12799 case (int)ScriptBaseClass.PRIM_OMEGA:
12800 if (remain < 3)
12801 return null;
12802 idx += 3;
12803 break;
12804
12805 case (int)ScriptBaseClass.PRIM_TEXTURE:
12806 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
12807 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
12808 if (remain < 5)
12809 return null;
12810 idx += 5;
12811 break;
12812
12813 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
12814 if (remain < 7)
12815 return null;
12816
12817 idx += 7;
12818 break;
12819
12820 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
12821 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
12822 return null;
12823
12824 return rules.GetSublist(idx, -1);
12825 }
12826 }
12827 }
12828 catch (InvalidCastException e)
12829 {
12830 ShoutError(string.Format(
12831 "{0} error running rule #{1}: arg #{2} ",
12832 originFunc, rulesParsed, idx - idxStart) + e.Message);
12833 }
12834 finally
12835 {
12836 if (positionChanged)
12837 {
12838 av.OffsetPosition = finalPos;
12839// av.SendAvatarDataToAllAgents();
12840 av.SendTerseUpdateToAllClients();
12841 positionChanged = false;
12842 }
12843 }
12844 return null;
12845 }
12846
12847 public LSL_List GetPrimParams(ScenePresence avatar, LSL_List rules, ref LSL_List res)
12848 {
12849 // avatars case
12850 // replies as SL wiki
12851
12852// SceneObjectPart sitPart = avatar.ParentPart; // most likelly it will be needed
12853 SceneObjectPart sitPart = World.GetSceneObjectPart(avatar.ParentID); // maybe better do this expensive search for it in case it's gone??
12854
12855 int idx = 0;
12856 while (idx < rules.Length)
12857 {
12858 int code = (int)rules.GetLSLIntegerItem(idx++);
12859 int remain = rules.Length - idx;
12860
12861 switch (code)
12862 {
12863 case (int)ScriptBaseClass.PRIM_MATERIAL:
12864 res.Add(new LSL_Integer((int)SOPMaterialData.SopMaterial.Flesh));
12865 break;
12866
12867 case (int)ScriptBaseClass.PRIM_PHYSICS:
12868 res.Add(new LSL_Integer(0));
12869 break;
12870
12871 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
12872 res.Add(new LSL_Integer(0));
12873 break;
12874
12875 case (int)ScriptBaseClass.PRIM_PHANTOM:
12876 res.Add(new LSL_Integer(0));
12877 break;
12878
12879 case (int)ScriptBaseClass.PRIM_POSITION:
12880
12881 Vector3 pos = avatar.OffsetPosition;
12882
12883 Vector3 sitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f *2.0f);
12884 pos -= sitOffset;
12885
12886 if( sitPart != null)
12887 pos = sitPart.GetWorldPosition() + pos * sitPart.GetWorldRotation();
12888
12889 res.Add(new LSL_Vector(pos.X,pos.Y,pos.Z));
12890 break;
12891
12892 case (int)ScriptBaseClass.PRIM_SIZE:
12893 // as in llGetAgentSize above
12894 res.Add(new LSL_Vector(0.45f, 0.6f, avatar.Appearance.AvatarHeight));
12895 break;
12896
12897 case (int)ScriptBaseClass.PRIM_ROTATION:
12898 Quaternion rot = avatar.Rotation;
12899 if (sitPart != null)
12900 {
12901 rot = sitPart.GetWorldRotation() * rot; // apply sit part world rotation
12902 }
12903
12904 res.Add(new LSL_Rotation (rot.X, rot.Y, rot.Z, rot.W));
12905 break;
12906
12907 case (int)ScriptBaseClass.PRIM_TYPE:
12908 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX));
12909 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT));
12910 res.Add(new LSL_Vector(0f,1.0f,0f));
12911 res.Add(new LSL_Float(0.0f));
12912 res.Add(new LSL_Vector(0, 0, 0));
12913 res.Add(new LSL_Vector(1.0f,1.0f,0f));
12914 res.Add(new LSL_Vector(0, 0, 0));
12915 break;
12916
12917 case (int)ScriptBaseClass.PRIM_TEXTURE:
12918 if (remain < 1)
12919 return null;
12920
12921 int face = (int)rules.GetLSLIntegerItem(idx++);
12922 if (face == ScriptBaseClass.ALL_SIDES)
12923 {
12924 for (face = 0; face < 21; face++)
12925 {
12926 res.Add(new LSL_String(""));
12927 res.Add(new LSL_Vector(0,0,0));
12928 res.Add(new LSL_Vector(0,0,0));
12929 res.Add(new LSL_Float(0.0));
12930 }
12931 }
12932 else
12933 {
12934 if (face >= 0 && face < 21)
12935 {
12936 res.Add(new LSL_String(""));
12937 res.Add(new LSL_Vector(0,0,0));
12938 res.Add(new LSL_Vector(0,0,0));
12939 res.Add(new LSL_Float(0.0));
12940 }
12941 }
12942 break;
12943
12944 case (int)ScriptBaseClass.PRIM_COLOR:
12945 if (remain < 1)
12946 return null;
12947
12948 face = (int)rules.GetLSLIntegerItem(idx++);
12949
12950 if (face == ScriptBaseClass.ALL_SIDES)
12951 {
12952 for (face = 0; face < 21; face++)
12953 {
12954 res.Add(new LSL_Vector(0,0,0));
12955 res.Add(new LSL_Float(0));
12956 }
12957 }
12958 else
12959 {
12960 res.Add(new LSL_Vector(0,0,0));
12961 res.Add(new LSL_Float(0));
12962 }
12963 break;
12964
12965 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
12966 if (remain < 1)
12967 return null;
12968 face = (int)rules.GetLSLIntegerItem(idx++);
12969
12970 if (face == ScriptBaseClass.ALL_SIDES)
12971 {
12972 for (face = 0; face < 21; face++)
12973 {
12974 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
12975 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
12976 }
12977 }
12978 else
12979 {
12980 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
12981 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
12982 }
12983 break;
12984
12985 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
12986 if (remain < 1)
12987 return null;
12988 face = (int)rules.GetLSLIntegerItem(idx++);
12989
12990 if (face == ScriptBaseClass.ALL_SIDES)
12991 {
12992 for (face = 0; face < 21; face++)
12993 {
12994 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
12995 }
12996 }
12997 else
12998 {
12999 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
13000 }
13001 break;
13002
13003 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
13004 res.Add(new LSL_Integer(0));
13005 res.Add(new LSL_Integer(0));// softness
13006 res.Add(new LSL_Float(0.0f)); // gravity
13007 res.Add(new LSL_Float(0.0f)); // friction
13008 res.Add(new LSL_Float(0.0f)); // wind
13009 res.Add(new LSL_Float(0.0f)); // tension
13010 res.Add(new LSL_Vector(0f,0f,0f));
13011 break;
13012
13013 case (int)ScriptBaseClass.PRIM_TEXGEN:
13014 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
13015 if (remain < 1)
13016 return null;
13017 face = (int)rules.GetLSLIntegerItem(idx++);
13018
13019 if (face == ScriptBaseClass.ALL_SIDES)
13020 {
13021 for (face = 0; face < 21; face++)
13022 {
13023 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
13024 }
13025 }
13026 else
13027 {
13028 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
13029 }
13030 break;
13031
13032 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
13033 res.Add(new LSL_Integer(0));
13034 res.Add(new LSL_Vector(0f,0f,0f));
13035 res.Add(new LSL_Float(0f)); // intensity
13036 res.Add(new LSL_Float(0f)); // radius
13037 res.Add(new LSL_Float(0f)); // falloff
13038 break;
13039
13040 case (int)ScriptBaseClass.PRIM_GLOW:
13041 if (remain < 1)
13042 return null;
13043 face = (int)rules.GetLSLIntegerItem(idx++);
13044
13045 if (face == ScriptBaseClass.ALL_SIDES)
13046 {
13047 for (face = 0; face < 21; face++)
13048 {
13049 res.Add(new LSL_Float(0f));
13050 }
13051 }
13052 else
13053 {
13054 res.Add(new LSL_Float(0f));
13055 }
13056 break;
13057
13058 case (int)ScriptBaseClass.PRIM_TEXT:
13059 res.Add(new LSL_String(""));
13060 res.Add(new LSL_Vector(0f,0f,0f));
13061 res.Add(new LSL_Float(1.0f));
13062 break;
13063
13064 case (int)ScriptBaseClass.PRIM_NAME:
13065 res.Add(new LSL_String(avatar.Name));
13066 break;
13067
13068 case (int)ScriptBaseClass.PRIM_DESC:
13069 res.Add(new LSL_String(""));
13070 break;
13071
13072 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
13073 Quaternion lrot = avatar.Rotation;
13074
13075 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
13076 {
13077 lrot = sitPart.RotationOffset * lrot; // apply sit part rotation offset
13078 }
13079 res.Add(new LSL_Rotation(lrot.X, lrot.Y, lrot.Z, lrot.W));
13080 break;
13081
13082 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
13083 Vector3 lpos = avatar.OffsetPosition; // pos relative to sit part
13084 Vector3 lsitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f * 2.0f);
13085 lpos -= lsitOffset;
13086
13087 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
13088 {
13089 lpos = sitPart.OffsetPosition + (lpos * sitPart.RotationOffset); // make it relative to root prim
13090 }
13091 res.Add(new LSL_Vector(lpos.X,lpos.Y,lpos.Z));
13092 break;
13093
13094 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
13095 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
13096 return null;
13097
13098 return rules.GetSublist(idx, -1);
13099 }
13100 }
13101
13102 return null;
13103 }
13093 } 13104 }
13094 13105
13095 public class NotecardCache 13106 public class NotecardCache
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
index 795de80..ceb4660 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
@@ -304,7 +304,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
304 case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY: 304 case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
305 idx++; 305 idx++;
306 iV = rules.GetVector3Item(idx); 306 iV = rules.GetVector3Item(idx);
307 wl.cloudDetailXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z); 307 wl.cloudDetailXYDensity = iV;
308 break; 308 break;
309 case (int)ScriptBaseClass.WL_CLOUD_SCALE: 309 case (int)ScriptBaseClass.WL_CLOUD_SCALE:
310 idx++; 310 idx++;
@@ -329,7 +329,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
329 case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY: 329 case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
330 idx++; 330 idx++;
331 iV = rules.GetVector3Item(idx); 331 iV = rules.GetVector3Item(idx);
332 wl.cloudXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z); 332 wl.cloudXYDensity = iV;
333 break; 333 break;
334 case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER: 334 case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
335 idx++; 335 idx++;
@@ -384,7 +384,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
384 case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE: 384 case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
385 idx++; 385 idx++;
386 iV = rules.GetVector3Item(idx); 386 iV = rules.GetVector3Item(idx);
387 wl.reflectionWaveletScale = new Vector3((float)iV.x, (float)iV.y, (float)iV.z); 387 wl.reflectionWaveletScale = iV;
388 break; 388 break;
389 case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE: 389 case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
390 idx++; 390 idx++;
@@ -422,7 +422,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
422 case (int)ScriptBaseClass.WL_WATER_COLOR: 422 case (int)ScriptBaseClass.WL_WATER_COLOR:
423 idx++; 423 idx++;
424 iV = rules.GetVector3Item(idx); 424 iV = rules.GetVector3Item(idx);
425 wl.waterColor = new Vector3((float)iV.x, (float)iV.y, (float)iV.z); 425 wl.waterColor = iV;
426 break; 426 break;
427 case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT: 427 case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
428 idx++; 428 idx++;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 7844c75..84cf6ca 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -333,8 +333,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
333 { 333 {
334 if (type == typeof(OpenMetaverse.Quaternion)) 334 if (type == typeof(OpenMetaverse.Quaternion))
335 { 335 {
336 LSL_Rotation rot = (LSL_Rotation)lslparm; 336 return (OpenMetaverse.Quaternion)((LSL_Rotation)lslparm);
337 return new OpenMetaverse.Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s);
338 } 337 }
339 } 338 }
340 339
@@ -343,8 +342,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
343 { 342 {
344 if (type == typeof(OpenMetaverse.Vector3)) 343 if (type == typeof(OpenMetaverse.Vector3))
345 { 344 {
346 LSL_Vector vect = (LSL_Vector)lslparm; 345 return (OpenMetaverse.Vector3)((LSL_Vector)lslparm);
347 return new OpenMetaverse.Vector3((float)vect.x,(float)vect.y,(float)vect.z);
348 } 346 }
349 } 347 }
350 348
@@ -367,13 +365,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
367 result[i] = new UUID((LSL_Key)plist[i]); 365 result[i] = new UUID((LSL_Key)plist[i]);
368 else if (plist[i] is LSL_Rotation) 366 else if (plist[i] is LSL_Rotation)
369 { 367 {
370 LSL_Rotation rot = (LSL_Rotation)plist[i]; 368 result[i] = (OpenMetaverse.Quaternion)(
371 result[i] = new OpenMetaverse.Quaternion((float)rot.x,(float)rot.y,(float)rot.z,(float)rot.s); 369 (LSL_Rotation)plist[i]);
372 } 370 }
373 else if (plist[i] is LSL_Vector) 371 else if (plist[i] is LSL_Vector)
374 { 372 {
375 LSL_Vector vect = (LSL_Vector)plist[i]; 373 result[i] = (OpenMetaverse.Vector3)(
376 result[i] = new OpenMetaverse.Vector3((float)vect.x,(float)vect.y,(float)vect.z); 374 (LSL_Vector)plist[i]);
377 } 375 }
378 else 376 else
379 MODError("unknown LSL list element type"); 377 MODError("unknown LSL list element type");
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 2f02f1f..ceff889 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -782,10 +782,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
782 782
783 // We will launch the teleport on a new thread so that when the script threads are terminated 783 // We will launch the teleport on a new thread so that when the script threads are terminated
784 // before teleport in ScriptInstance.GetXMLState(), we don't end up aborting the one doing the teleporting. 784 // before teleport in ScriptInstance.GetXMLState(), we don't end up aborting the one doing the teleporting.
785 Util.FireAndForget( 785 Util.FireAndForget(o => World.RequestTeleportLocation(
786 o => World.RequestTeleportLocation(presence.ControllingClient, regionName, 786 presence.ControllingClient, regionName, position,
787 new Vector3((float)position.x, (float)position.y, (float)position.z), 787 lookat, (uint)TPFlags.ViaLocation));
788 new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation));
789 788
790 ScriptSleep(5000); 789 ScriptSleep(5000);
791 790
@@ -828,10 +827,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
828 827
829 // We will launch the teleport on a new thread so that when the script threads are terminated 828 // We will launch the teleport on a new thread so that when the script threads are terminated
830 // before teleport in ScriptInstance.GetXMLState(), we don't end up aborting the one doing the teleporting. 829 // before teleport in ScriptInstance.GetXMLState(), we don't end up aborting the one doing the teleporting.
831 Util.FireAndForget( 830 Util.FireAndForget(o => World.RequestTeleportLocation(
832 o => World.RequestTeleportLocation(presence.ControllingClient, regionHandle, 831 presence.ControllingClient, regionHandle,
833 new Vector3((float)position.x, (float)position.y, (float)position.z), 832 position, lookat, (uint)TPFlags.ViaLocation));
834 new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation));
835 833
836 ScriptSleep(5000); 834 ScriptSleep(5000);
837 835
@@ -2259,11 +2257,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2259 CheckThreatLevel(ThreatLevel.High, "osGetLinkPrimitiveParams"); 2257 CheckThreatLevel(ThreatLevel.High, "osGetLinkPrimitiveParams");
2260 m_host.AddScriptLPS(1); 2258 m_host.AddScriptLPS(1);
2261 InitLSL(); 2259 InitLSL();
2260 // One needs to cast m_LSL_Api because we're using functions not
2261 // on the ILSL_Api interface.
2262 LSL_Api LSL_Api = (LSL_Api)m_LSL_Api;
2262 LSL_List retVal = new LSL_List(); 2263 LSL_List retVal = new LSL_List();
2263 List<SceneObjectPart> parts = ((LSL_Api)m_LSL_Api).GetLinkParts(linknumber); 2264 LSL_List remaining = null;
2265 List<SceneObjectPart> parts = LSL_Api.GetLinkParts(linknumber);
2264 foreach (SceneObjectPart part in parts) 2266 foreach (SceneObjectPart part in parts)
2265 { 2267 {
2266 retVal += ((LSL_Api)m_LSL_Api).GetLinkPrimitiveParams(part, rules); 2268 remaining = LSL_Api.GetPrimParams(part, rules, ref retVal);
2269 }
2270
2271 while (remaining != null && remaining.Length > 2)
2272 {
2273 linknumber = remaining.GetLSLIntegerItem(0);
2274 rules = remaining.GetSublist(1, -1);
2275 parts = LSL_Api.GetLinkParts(linknumber);
2276
2277 foreach (SceneObjectPart part in parts)
2278 remaining = LSL_Api.GetPrimParams(part, rules, ref retVal);
2267 } 2279 }
2268 return retVal; 2280 return retVal;
2269 } 2281 }
@@ -2355,7 +2367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2355 ownerID = m_host.OwnerID; 2367 ownerID = m_host.OwnerID;
2356 UUID x = module.CreateNPC(firstname, 2368 UUID x = module.CreateNPC(firstname,
2357 lastname, 2369 lastname,
2358 new Vector3((float) position.x, (float) position.y, (float) position.z), 2370 position,
2359 ownerID, 2371 ownerID,
2360 senseAsAgent, 2372 senseAsAgent,
2361 World, 2373 World,
@@ -2478,7 +2490,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2478 return new LSL_Vector(0, 0, 0); 2490 return new LSL_Vector(0, 0, 0);
2479 } 2491 }
2480 2492
2481 public void osNpcMoveTo(LSL_Key npc, LSL_Vector position) 2493 public void osNpcMoveTo(LSL_Key npc, LSL_Vector pos)
2482 { 2494 {
2483 CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); 2495 CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo");
2484 m_host.AddScriptLPS(1); 2496 m_host.AddScriptLPS(1);
@@ -2493,7 +2505,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2493 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2505 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2494 return; 2506 return;
2495 2507
2496 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
2497 module.MoveToTarget(npcId, World, pos, false, true, false); 2508 module.MoveToTarget(npcId, World, pos, false, true, false);
2498 } 2509 }
2499 } 2510 }
@@ -2513,11 +2524,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2513 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2524 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2514 return; 2525 return;
2515 2526
2516 Vector3 pos = new Vector3((float)target.x, (float)target.y, (float)target.z);
2517 module.MoveToTarget( 2527 module.MoveToTarget(
2518 new UUID(npc.m_string), 2528 new UUID(npc.m_string),
2519 World, 2529 World,
2520 pos, 2530 target,
2521 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, 2531 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0,
2522 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0, 2532 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0,
2523 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0); 2533 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0);
@@ -2569,7 +2579,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2569 ScenePresence sp = World.GetScenePresence(npcId); 2579 ScenePresence sp = World.GetScenePresence(npcId);
2570 2580
2571 if (sp != null) 2581 if (sp != null)
2572 sp.Rotation = LSL_Api.Rot2Quaternion(rotation); 2582 sp.Rotation = rotation;
2573 } 2583 }
2574 } 2584 }
2575 2585
@@ -2929,7 +2939,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2929 avatar.SpeedModifier = (float)SpeedModifier; 2939 avatar.SpeedModifier = (float)SpeedModifier;
2930 } 2940 }
2931 2941
2932 public void osKickAvatar(string FirstName,string SurName,string alert) 2942 public void osKickAvatar(string FirstName, string SurName, string alert)
2933 { 2943 {
2934 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); 2944 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar");
2935 m_host.AddScriptLPS(1); 2945 m_host.AddScriptLPS(1);
@@ -2943,10 +2953,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2943 sp.ControllingClient.Kick(alert); 2953 sp.ControllingClient.Kick(alert);
2944 2954
2945 // ...and close on our side 2955 // ...and close on our side
2946 sp.Scene.IncomingCloseAgent(sp.UUID); 2956 sp.Scene.IncomingCloseAgent(sp.UUID, false);
2947 } 2957 }
2948 }); 2958 });
2949 } 2959 }
2960
2961 public LSL_Float osGetHealth(string avatar)
2962 {
2963 CheckThreatLevel(ThreatLevel.None, "osGetHealth");
2964 m_host.AddScriptLPS(1);
2965
2966 LSL_Float health = new LSL_Float(-1);
2967 ScenePresence presence = World.GetScenePresence(new UUID(avatar));
2968 if (presence != null) health = presence.Health;
2969 return health;
2970 }
2950 2971
2951 public void osCauseDamage(string avatar, double damage) 2972 public void osCauseDamage(string avatar, double damage)
2952 { 2973 {
@@ -3006,7 +3027,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3006 m_host.AddScriptLPS(1); 3027 m_host.AddScriptLPS(1);
3007 InitLSL(); 3028 InitLSL();
3008 3029
3009 return m_LSL_Api.GetLinkPrimitiveParamsEx(prim, rules); 3030 return m_LSL_Api.GetPrimitiveParamsEx(prim, rules);
3010 } 3031 }
3011 3032
3012 public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules) 3033 public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules)
@@ -3015,7 +3036,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3015 m_host.AddScriptLPS(1); 3036 m_host.AddScriptLPS(1);
3016 InitLSL(); 3037 InitLSL();
3017 3038
3018 m_LSL_Api.SetPrimitiveParamsEx(prim, rules); 3039 m_LSL_Api.SetPrimitiveParamsEx(prim, rules, "osSetPrimitiveParams");
3019 } 3040 }
3020 3041
3021 /// <summary> 3042 /// <summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 678f9d5..4dd795d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -352,7 +352,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
352 q = avatar.Rotation; 352 q = avatar.Rotation;
353 } 353 }
354 354
355 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); 355 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q);
356 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); 356 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
357 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); 357 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
358 358
@@ -429,9 +429,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
429 try 429 try
430 { 430 {
431 Vector3 diff = toRegionPos - fromRegionPos; 431 Vector3 diff = toRegionPos - fromRegionPos;
432 LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); 432 double dot = LSL_Types.Vector3.Dot(forward_dir, diff);
433 double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); 433 double mag_obj = LSL_Types.Vector3.Mag(diff);
434 double mag_obj = LSL_Types.Vector3.Mag(obj_dir);
435 ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); 434 ang_obj = Math.Acos(dot / (mag_fwd * mag_obj));
436 } 435 }
437 catch 436 catch
@@ -483,7 +482,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
483 q = avatar.Rotation; 482 q = avatar.Rotation;
484 } 483 }
485 484
486 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); 485 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q);
487 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); 486 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
488 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); 487 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
489 bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); 488 bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0);
@@ -564,8 +563,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
564 double ang_obj = 0; 563 double ang_obj = 0;
565 try 564 try
566 { 565 {
567 Vector3 diff = toRegionPos - fromRegionPos; 566 LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(
568 LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); 567 toRegionPos - fromRegionPos);
569 double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); 568 double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir);
570 double mag_obj = LSL_Types.Vector3.Mag(obj_dir); 569 double mag_obj = LSL_Types.Vector3.Mag(obj_dir);
571 ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); 570 ang_obj = Math.Acos(dot / (mag_fwd * mag_obj));
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index af35258..05c20f9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -429,8 +429,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
429 LSL_Integer llGetLinkNumberOfSides(LSL_Integer link); 429 LSL_Integer llGetLinkNumberOfSides(LSL_Integer link);
430 void llSetPhysicsMaterial(int material_bits, float material_gravity_modifier, float material_restitution, float material_friction, float material_density); 430 void llSetPhysicsMaterial(int material_bits, float material_gravity_modifier, float material_restitution, float material_friction, float material_density);
431 431
432 void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules); 432 void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc);
433 LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
434 void llSetKeyframedMotion(LSL_List frames, LSL_List options); 433 void llSetKeyframedMotion(LSL_List frames, LSL_List options);
434 LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
435 } 435 }
436} 436}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 8c34ed3..d0e041c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -40,16 +40,75 @@ using LSL_Key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
40 40
41namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces 41namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
42{ 42{
43 /// <summary>
44 /// To permit region owners to enable the extended scripting functionality
45 /// of OSSL, without allowing malicious scripts to access potentially
46 /// troublesome functions, each OSSL function is assigned a threat level,
47 /// and access to the functions is granted or denied based on a default
48 /// threshold set in OpenSim.ini (which can be overridden for individual
49 /// functions on a case-by-case basis)
50 /// </summary>
43 public enum ThreatLevel 51 public enum ThreatLevel
44 { 52 {
53 // Not documented, presumably means permanently disabled ?
45 NoAccess = -1, 54 NoAccess = -1,
55
56 /// <summary>
57 /// Function is no threat at all. It doesn't constitute a threat to
58 /// either users or the system and has no known side effects.
59 /// </summary>
46 None = 0, 60 None = 0,
61
62 /// <summary>
63 /// Abuse of this command can cause a nuisance to the region operator,
64 /// such as log message spew.
65 /// </summary>
47 Nuisance = 1, 66 Nuisance = 1,
67
68 /// <summary>
69 /// Extreme levels of abuse of this function can cause impaired
70 /// functioning of the region, or very gullible users can be tricked
71 /// into experiencing harmless effects.
72 /// </summary>
48 VeryLow = 2, 73 VeryLow = 2,
74
75 /// <summary>
76 /// Intentional abuse can cause crashes or malfunction under certain
77 /// circumstances, which can be easily rectified; or certain users can
78 /// be tricked into certain situations in an avoidable manner.
79 /// </summary>
49 Low = 3, 80 Low = 3,
81
82 /// <summary>
83 /// Intentional abuse can cause denial of service and crashes with
84 /// potential of data or state loss; or trusting users can be tricked
85 /// into embarrassing or uncomfortable situations.
86 /// </summary>
50 Moderate = 4, 87 Moderate = 4,
88
89 /// <summary>
90 /// Casual abuse can cause impaired functionality or temporary denial
91 /// of service conditions. Intentional abuse can easily cause crashes
92 /// with potential data loss, or can be used to trick experienced and
93 /// cautious users into unwanted situations, or changes global data
94 /// permanently and without undo ability.
95 /// </summary>
51 High = 5, 96 High = 5,
97
98 /// <summary>
99 /// Even normal use may, depending on the number of instances, or
100 /// frequency of use, result in severe service impairment or crash
101 /// with loss of data, or can be used to cause unwanted or harmful
102 /// effects on users without giving the user a means to avoid it.
103 /// </summary>
52 VeryHigh = 6, 104 VeryHigh = 6,
105
106 /// <summary>
107 /// Even casual use is a danger to region stability, or function allows
108 /// console or OS command execution, or function allows taking money
109 /// without consent, or allows deletion or modification of user data,
110 /// or allows the compromise of sensitive data by design.
111 /// </summary>
53 Severe = 7 112 Severe = 7
54 }; 113 };
55 114
@@ -258,6 +317,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
258 int osGetSimulatorMemory(); 317 int osGetSimulatorMemory();
259 void osKickAvatar(string FirstName,string SurName,string alert); 318 void osKickAvatar(string FirstName,string SurName,string alert);
260 void osSetSpeed(string UUID, LSL_Float SpeedModifier); 319 void osSetSpeed(string UUID, LSL_Float SpeedModifier);
320 LSL_Float osGetHealth(string avatar);
261 void osCauseHealing(string avatar, double healing); 321 void osCauseHealing(string avatar, double healing);
262 void osCauseDamage(string avatar, double damage); 322 void osCauseDamage(string avatar, double damage);
263 LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules); 323 LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index f989cc6..05ba222 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -329,6 +329,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
329 public const int PRIM_OMEGA = 32; 329 public const int PRIM_OMEGA = 32;
330 public const int PRIM_POS_LOCAL = 33; 330 public const int PRIM_POS_LOCAL = 33;
331 public const int PRIM_LINK_TARGET = 34; 331 public const int PRIM_LINK_TARGET = 34;
332 public const int PRIM_SLICE = 35;
332 public const int PRIM_TEXGEN_DEFAULT = 0; 333 public const int PRIM_TEXGEN_DEFAULT = 0;
333 public const int PRIM_TEXGEN_PLANAR = 1; 334 public const int PRIM_TEXGEN_PLANAR = 1;
334 335
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 94405d2..e9131e4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -865,7 +865,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
865 { 865 {
866 m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier); 866 m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier);
867 } 867 }
868 868
869 public LSL_Float osGetHealth(string avatar)
870 {
871 return m_OSSL_Functions.osGetHealth(avatar);
872 }
873
869 public void osCauseDamage(string avatar, double damage) 874 public void osCauseDamage(string avatar, double damage)
870 { 875 {
871 m_OSSL_Functions.osCauseDamage(avatar, damage); 876 m_OSSL_Functions.osCauseDamage(avatar, damage);
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index 17a0d69..03be2ab 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
@@ -546,6 +546,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
546 "OpenSim.Region.ScriptEngine.Shared.dll")); 546 "OpenSim.Region.ScriptEngine.Shared.dll"));
547 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, 547 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
548 "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll")); 548 "OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll"));
549 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
550 "OpenMetaverseTypes.dll"));
549 551
550 if (lang == enumCompileType.yp) 552 if (lang == enumCompileType.yp)
551 { 553 {
diff --git a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
index 9e5fb24..22804f5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
@@ -164,11 +164,11 @@ namespace OpenSim.Region.ScriptEngine.Shared
164 else 164 else
165 { 165 {
166 // Set the values from the touch data provided by the client 166 // Set the values from the touch data provided by the client
167 touchST = new LSL_Types.Vector3(value.STCoord.X, value.STCoord.Y, value.STCoord.Z); 167 touchST = new LSL_Types.Vector3(value.STCoord);
168 touchUV = new LSL_Types.Vector3(value.UVCoord.X, value.UVCoord.Y, value.UVCoord.Z); 168 touchUV = new LSL_Types.Vector3(value.UVCoord);
169 touchNormal = new LSL_Types.Vector3(value.Normal.X, value.Normal.Y, value.Normal.Z); 169 touchNormal = new LSL_Types.Vector3(value.Normal);
170 touchBinormal = new LSL_Types.Vector3(value.Binormal.X, value.Binormal.Y, value.Binormal.Z); 170 touchBinormal = new LSL_Types.Vector3(value.Binormal);
171 touchPos = new LSL_Types.Vector3(value.Position.X, value.Position.Y, value.Position.Z); 171 touchPos = new LSL_Types.Vector3(value.Position);
172 touchFace = value.FaceIndex; 172 touchFace = value.FaceIndex;
173 } 173 }
174 } 174 }
@@ -189,19 +189,13 @@ namespace OpenSim.Region.ScriptEngine.Shared
189 Country = account.UserCountry; 189 Country = account.UserCountry;
190 190
191 Owner = Key; 191 Owner = Key;
192 Position = new LSL_Types.Vector3( 192 Position = new LSL_Types.Vector3(presence.AbsolutePosition);
193 presence.AbsolutePosition.X,
194 presence.AbsolutePosition.Y,
195 presence.AbsolutePosition.Z);
196 Rotation = new LSL_Types.Quaternion( 193 Rotation = new LSL_Types.Quaternion(
197 presence.Rotation.X, 194 presence.Rotation.X,
198 presence.Rotation.Y, 195 presence.Rotation.Y,
199 presence.Rotation.Z, 196 presence.Rotation.Z,
200 presence.Rotation.W); 197 presence.Rotation.W);
201 Velocity = new LSL_Types.Vector3( 198 Velocity = new LSL_Types.Vector3(presence.Velocity);
202 presence.Velocity.X,
203 presence.Velocity.Y,
204 presence.Velocity.Z);
205 199
206 Type = 0x01; // Avatar 200 Type = 0x01; // Avatar
207 if (presence.PresenceType == PresenceType.Npc) 201 if (presence.PresenceType == PresenceType.Npc)
@@ -254,16 +248,12 @@ namespace OpenSim.Region.ScriptEngine.Shared
254 } 248 }
255 } 249 }
256 250
257 Position = new LSL_Types.Vector3(part.AbsolutePosition.X, 251 Position = new LSL_Types.Vector3(part.AbsolutePosition);
258 part.AbsolutePosition.Y,
259 part.AbsolutePosition.Z);
260 252
261 Quaternion wr = part.ParentGroup.GroupRotation; 253 Quaternion wr = part.ParentGroup.GroupRotation;
262 Rotation = new LSL_Types.Quaternion(wr.X, wr.Y, wr.Z, wr.W); 254 Rotation = new LSL_Types.Quaternion(wr.X, wr.Y, wr.Z, wr.W);
263 255
264 Velocity = new LSL_Types.Vector3(part.Velocity.X, 256 Velocity = new LSL_Types.Vector3(part.Velocity);
265 part.Velocity.Y,
266 part.Velocity.Z);
267 } 257 }
268 } 258 }
269 259
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index 8adf4c5..c9c4753 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -31,6 +31,11 @@ using System.Globalization;
31using System.Text.RegularExpressions; 31using System.Text.RegularExpressions;
32using OpenSim.Framework; 32using OpenSim.Framework;
33 33
34using OpenMetaverse;
35using OMV_Vector3 = OpenMetaverse.Vector3;
36using OMV_Vector3d = OpenMetaverse.Vector3d;
37using OMV_Quaternion = OpenMetaverse.Quaternion;
38
34namespace OpenSim.Region.ScriptEngine.Shared 39namespace OpenSim.Region.ScriptEngine.Shared
35{ 40{
36 [Serializable] 41 [Serializable]
@@ -54,6 +59,20 @@ namespace OpenSim.Region.ScriptEngine.Shared
54 z = (float)vector.z; 59 z = (float)vector.z;
55 } 60 }
56 61
62 public Vector3(OMV_Vector3 vector)
63 {
64 x = vector.X;
65 y = vector.Y;
66 z = vector.Z;
67 }
68
69 public Vector3(OMV_Vector3d vector)
70 {
71 x = vector.X;
72 y = vector.Y;
73 z = vector.Z;
74 }
75
57 public Vector3(double X, double Y, double Z) 76 public Vector3(double X, double Y, double Z)
58 { 77 {
59 x = X; 78 x = X;
@@ -109,6 +128,26 @@ namespace OpenSim.Region.ScriptEngine.Shared
109 return new list(new object[] { vec }); 128 return new list(new object[] { vec });
110 } 129 }
111 130
131 public static implicit operator OMV_Vector3(Vector3 vec)
132 {
133 return new OMV_Vector3((float)vec.x, (float)vec.y, (float)vec.z);
134 }
135
136 public static implicit operator Vector3(OMV_Vector3 vec)
137 {
138 return new Vector3(vec);
139 }
140
141 public static implicit operator OMV_Vector3d(Vector3 vec)
142 {
143 return new OMV_Vector3d(vec.x, vec.y, vec.z);
144 }
145
146 public static implicit operator Vector3(OMV_Vector3d vec)
147 {
148 return new Vector3(vec);
149 }
150
112 public static bool operator ==(Vector3 lhs, Vector3 rhs) 151 public static bool operator ==(Vector3 lhs, Vector3 rhs)
113 { 152 {
114 return (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z); 153 return (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z);
@@ -322,6 +361,14 @@ namespace OpenSim.Region.ScriptEngine.Shared
322 s = 1; 361 s = 1;
323 } 362 }
324 363
364 public Quaternion(OMV_Quaternion rot)
365 {
366 x = rot.X;
367 y = rot.Y;
368 z = rot.Z;
369 s = rot.W;
370 }
371
325 #endregion 372 #endregion
326 373
327 #region Overriders 374 #region Overriders
@@ -368,6 +415,21 @@ namespace OpenSim.Region.ScriptEngine.Shared
368 return new list(new object[] { r }); 415 return new list(new object[] { r });
369 } 416 }
370 417
418 public static implicit operator OMV_Quaternion(Quaternion rot)
419 {
420 // LSL quaternions can normalize to 0, normal Quaternions can't.
421 if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0)
422 rot.z = 1; // ZERO_ROTATION = 0,0,0,1
423 OMV_Quaternion omvrot = new OMV_Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
424 omvrot.Normalize();
425 return omvrot;
426 }
427
428 public static implicit operator Quaternion(OMV_Quaternion rot)
429 {
430 return new Quaternion(rot);
431 }
432
371 public static bool operator ==(Quaternion lhs, Quaternion rhs) 433 public static bool operator ==(Quaternion lhs, Quaternion rhs)
372 { 434 {
373 // Return true if the fields match: 435 // Return true if the fields match:
@@ -562,12 +624,23 @@ namespace OpenSim.Region.ScriptEngine.Shared
562 else if (m_data[itemIndex] is LSL_Types.LSLString) 624 else if (m_data[itemIndex] is LSL_Types.LSLString)
563 return new LSLInteger(m_data[itemIndex].ToString()); 625 return new LSLInteger(m_data[itemIndex].ToString());
564 else 626 else
565 throw new InvalidCastException(); 627 throw new InvalidCastException(string.Format(
628 "{0} expected but {1} given",
629 typeof(LSL_Types.LSLInteger).Name,
630 m_data[itemIndex] != null ?
631 m_data[itemIndex].GetType().Name : "null"));
566 } 632 }
567 633
568 public LSL_Types.Vector3 GetVector3Item(int itemIndex) 634 public LSL_Types.Vector3 GetVector3Item(int itemIndex)
569 { 635 {
570 return (LSL_Types.Vector3)m_data[itemIndex]; 636 if(m_data[itemIndex] is LSL_Types.Vector3)
637 return (LSL_Types.Vector3)m_data[itemIndex];
638 else
639 throw new InvalidCastException(string.Format(
640 "{0} expected but {1} given",
641 typeof(LSL_Types.Vector3).Name,
642 m_data[itemIndex] != null ?
643 m_data[itemIndex].GetType().Name : "null"));
571 } 644 }
572 645
573 public LSL_Types.Quaternion GetQuaternionItem(int itemIndex) 646 public LSL_Types.Quaternion GetQuaternionItem(int itemIndex)
diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs
index 5c4174e..cee10df 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs
@@ -152,9 +152,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
152 det[0] = new DetectParams(); 152 det[0] = new DetectParams();
153 det[0].Key = remoteClient.AgentId; 153 det[0].Key = remoteClient.AgentId;
154 det[0].Populate(myScriptEngine.World); 154 det[0].Populate(myScriptEngine.World);
155 det[0].OffsetPos = new LSL_Types.Vector3(offsetPos.X, 155 det[0].OffsetPos = offsetPos;
156 offsetPos.Y,
157 offsetPos.Z);
158 156
159 if (originalID == 0) 157 if (originalID == 0)
160 { 158 {
@@ -298,9 +296,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
298 foreach (DetectedObject detobj in col.Colliders) 296 foreach (DetectedObject detobj in col.Colliders)
299 { 297 {
300 DetectParams d = new DetectParams(); 298 DetectParams d = new DetectParams();
301 d.Position = new LSL_Types.Vector3(detobj.posVector.X, 299 d.Position = detobj.posVector;
302 detobj.posVector.Y,
303 detobj.posVector.Z);
304 d.Populate(myScriptEngine.World); 300 d.Populate(myScriptEngine.World);
305 det.Add(d); 301 det.Add(d);
306 myScriptEngine.PostObjectEvent(localID, new EventParams( 302 myScriptEngine.PostObjectEvent(localID, new EventParams(
@@ -318,9 +314,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
318 foreach (DetectedObject detobj in col.Colliders) 314 foreach (DetectedObject detobj in col.Colliders)
319 { 315 {
320 DetectParams d = new DetectParams(); 316 DetectParams d = new DetectParams();
321 d.Position = new LSL_Types.Vector3(detobj.posVector.X, 317 d.Position = detobj.posVector;
322 detobj.posVector.Y,
323 detobj.posVector.Z);
324 d.Populate(myScriptEngine.World); 318 d.Populate(myScriptEngine.World);
325 det.Add(d); 319 det.Add(d);
326 myScriptEngine.PostObjectEvent(localID, new EventParams( 320 myScriptEngine.PostObjectEvent(localID, new EventParams(
@@ -337,9 +331,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
337 foreach (DetectedObject detobj in col.Colliders) 331 foreach (DetectedObject detobj in col.Colliders)
338 { 332 {
339 DetectParams d = new DetectParams(); 333 DetectParams d = new DetectParams();
340 d.Position = new LSL_Types.Vector3(detobj.posVector.X, 334 d.Position = detobj.posVector;
341 detobj.posVector.Y,
342 detobj.posVector.Z);
343 d.Populate(myScriptEngine.World); 335 d.Populate(myScriptEngine.World);
344 det.Add(d); 336 det.Add(d);
345 myScriptEngine.PostObjectEvent(localID, new EventParams( 337 myScriptEngine.PostObjectEvent(localID, new EventParams(
@@ -381,8 +373,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
381 myScriptEngine.PostObjectEvent(localID, new EventParams( 373 myScriptEngine.PostObjectEvent(localID, new EventParams(
382 "at_target", new object[] { 374 "at_target", new object[] {
383 new LSL_Types.LSLInteger(handle), 375 new LSL_Types.LSLInteger(handle),
384 new LSL_Types.Vector3(targetpos.X,targetpos.Y,targetpos.Z), 376 new LSL_Types.Vector3(targetpos),
385 new LSL_Types.Vector3(atpos.X,atpos.Y,atpos.Z) }, 377 new LSL_Types.Vector3(atpos) },
386 new DetectParams[0])); 378 new DetectParams[0]));
387 } 379 }
388 380
@@ -399,8 +391,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
399 myScriptEngine.PostObjectEvent(localID, new EventParams( 391 myScriptEngine.PostObjectEvent(localID, new EventParams(
400 "at_rot_target", new object[] { 392 "at_rot_target", new object[] {
401 new LSL_Types.LSLInteger(handle), 393 new LSL_Types.LSLInteger(handle),
402 new LSL_Types.Quaternion(targetrot.X,targetrot.Y,targetrot.Z,targetrot.W), 394 new LSL_Types.Quaternion(targetrot),
403 new LSL_Types.Quaternion(atrot.X,atrot.Y,atrot.Z,atrot.W) }, 395 new LSL_Types.Quaternion(atrot) },
404 new DetectParams[0])); 396 new DetectParams[0]));
405 } 397 }
406 398
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index f6cb7df..9f05666 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -656,7 +656,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
656 if (m_Assemblies.ContainsKey(instance.AssetID)) 656 if (m_Assemblies.ContainsKey(instance.AssetID))
657 { 657 {
658 string assembly = m_Assemblies[instance.AssetID]; 658 string assembly = m_Assemblies[instance.AssetID];
659 instance.SaveState(assembly); 659
660 try
661 {
662 instance.SaveState(assembly);
663 }
664 catch (Exception e)
665 {
666 m_log.Error(
667 string.Format(
668 "[XEngine]: Failed final state save for script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ",
669 instance.PrimName, instance.ScriptName, instance.ItemID, instance.ObjectID, World.Name)
670 , e);
671 }
660 } 672 }
661 673
662 // Clear the event queue and abort the instance thread 674 // Clear the event queue and abort the instance thread
@@ -778,7 +790,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
778 assembly = m_Assemblies[i.AssetID]; 790 assembly = m_Assemblies[i.AssetID];
779 791
780 792
781 i.SaveState(assembly); 793 try
794 {
795 i.SaveState(assembly);
796 }
797 catch (Exception e)
798 {
799 m_log.Error(
800 string.Format(
801 "[XEngine]: Failed to save state of script {0}.{1}, item UUID {2}, prim UUID {3} in {4}. Exception ",
802 i.PrimName, i.ScriptName, i.ItemID, i.ObjectID, World.Name)
803 , e);
804 }
782 } 805 }
783 806
784 instances.Clear(); 807 instances.Clear();
@@ -971,6 +994,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
971 // This delay exists to stop mono problems where script compilation and startup would stop the sim 994 // This delay exists to stop mono problems where script compilation and startup would stop the sim
972 // working properly for the session. 995 // working properly for the session.
973 System.Threading.Thread.Sleep(m_StartDelay); 996 System.Threading.Thread.Sleep(m_StartDelay);
997
998 m_log.InfoFormat("[XEngine]: Performing initial script startup on {0}", m_Scene.Name);
974 } 999 }
975 1000
976 object[] o; 1001 object[] o;
@@ -986,13 +1011,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
986 if (m_InitialStartup) 1011 if (m_InitialStartup)
987 if (scriptsStarted % 50 == 0) 1012 if (scriptsStarted % 50 == 0)
988 m_log.InfoFormat( 1013 m_log.InfoFormat(
989 "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); 1014 "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.Name);
990 } 1015 }
991 } 1016 }
992 1017
993 if (m_InitialStartup) 1018 if (m_InitialStartup)
994 m_log.InfoFormat( 1019 m_log.InfoFormat(
995 "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName); 1020 "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.Name);
996 1021
997 // NOTE: Despite having a lockless queue, this lock is required 1022 // NOTE: Despite having a lockless queue, this lock is required
998 // to make sure there is never no compile thread while there 1023 // to make sure there is never no compile thread while there
@@ -1053,10 +1078,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1053 return false; 1078 return false;
1054 } 1079 }
1055 1080
1056 UUID assetID = item.AssetID; 1081 m_log.DebugFormat(
1082 "[XEngine] Loading script {0}.{1}, item UUID {2}, prim UUID {3} @ {4}.{5}",
1083 part.ParentGroup.RootPart.Name, item.Name, itemID, part.UUID,
1084 part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
1057 1085
1058 //m_log.DebugFormat("[XEngine] Compiling script {0} ({1} on object {2})", 1086 UUID assetID = item.AssetID;
1059 // item.Name, itemID.ToString(), part.ParentGroup.RootPart.Name);
1060 1087
1061 ScenePresence presence = m_Scene.GetScenePresence(item.OwnerID); 1088 ScenePresence presence = m_Scene.GetScenePresence(item.OwnerID);
1062 1089
@@ -1235,10 +1262,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1235 item.Name, startParam, postOnRez, 1262 item.Name, startParam, postOnRez,
1236 stateSource, m_MaxScriptQueue); 1263 stateSource, m_MaxScriptQueue);
1237 1264
1238 m_log.DebugFormat( 1265// m_log.DebugFormat(
1239 "[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}.{5}", 1266// "[XEngine] Loaded script {0}.{1}, script UUID {2}, prim UUID {3} @ {4}.{5}",
1240 part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID, 1267// part.ParentGroup.RootPart.Name, item.Name, assetID, part.UUID,
1241 part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName); 1268// part.ParentGroup.RootPart.AbsolutePosition, part.ParentGroup.Scene.RegionInfo.RegionName);
1242 1269
1243 if (presence != null) 1270 if (presence != null)
1244 { 1271 {
@@ -1554,9 +1581,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1554 else if (p[i] is string) 1581 else if (p[i] is string)
1555 lsl_p[i] = new LSL_Types.LSLString((string)p[i]); 1582 lsl_p[i] = new LSL_Types.LSLString((string)p[i]);
1556 else if (p[i] is Vector3) 1583 else if (p[i] is Vector3)
1557 lsl_p[i] = new LSL_Types.Vector3(((Vector3)p[i]).X, ((Vector3)p[i]).Y, ((Vector3)p[i]).Z); 1584 lsl_p[i] = new LSL_Types.Vector3((Vector3)p[i]);
1558 else if (p[i] is Quaternion) 1585 else if (p[i] is Quaternion)
1559 lsl_p[i] = new LSL_Types.Quaternion(((Quaternion)p[i]).X, ((Quaternion)p[i]).Y, ((Quaternion)p[i]).Z, ((Quaternion)p[i]).W); 1586 lsl_p[i] = new LSL_Types.Quaternion((Quaternion)p[i]);
1560 else if (p[i] is float) 1587 else if (p[i] is float)
1561 lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]); 1588 lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]);
1562 else 1589 else
@@ -1580,9 +1607,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1580 else if (p[i] is string) 1607 else if (p[i] is string)
1581 lsl_p[i] = new LSL_Types.LSLString((string)p[i]); 1608 lsl_p[i] = new LSL_Types.LSLString((string)p[i]);
1582 else if (p[i] is Vector3) 1609 else if (p[i] is Vector3)
1583 lsl_p[i] = new LSL_Types.Vector3(((Vector3)p[i]).X, ((Vector3)p[i]).Y, ((Vector3)p[i]).Z); 1610 lsl_p[i] = new LSL_Types.Vector3((Vector3)p[i]);
1584 else if (p[i] is Quaternion) 1611 else if (p[i] is Quaternion)
1585 lsl_p[i] = new LSL_Types.Quaternion(((Quaternion)p[i]).X, ((Quaternion)p[i]).Y, ((Quaternion)p[i]).Z, ((Quaternion)p[i]).W); 1612 lsl_p[i] = new LSL_Types.Quaternion((Quaternion)p[i]);
1586 else if (p[i] is float) 1613 else if (p[i] is float)
1587 lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]); 1614 lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]);
1588 else 1615 else