aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs1329
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs24
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs254
-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.cs91
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs53
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs26
-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, 1224 insertions, 766 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index f9b4bfd..9570669 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -341,7 +341,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
341 return GetLinkParts(m_host, linkType); 341 return GetLinkParts(m_host, linkType);
342 } 342 }
343 343
344 private List<SceneObjectPart> GetLinkParts(SceneObjectPart part, int linkType) 344 public static List<SceneObjectPart> GetLinkParts(SceneObjectPart part, int linkType)
345 { 345 {
346 List<SceneObjectPart> ret = new List<SceneObjectPart>(); 346 List<SceneObjectPart> ret = new List<SceneObjectPart>();
347 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 347 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
@@ -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)
@@ -2202,7 +2182,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2202 pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region. 2182 pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region.
2203 pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region. 2183 pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region.
2204 pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region. 2184 pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region.
2205 pos.z > 4096 // return FALSE if altitude than 4096m 2185 pos.z > Constants.RegionHeight // return FALSE if altitude than 4096m
2206 ) 2186 )
2207 ) 2187 )
2208 { 2188 {
@@ -2213,14 +2193,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2213 // this could possibly be done in the above else-if block, but we're doing the check here to keep the code easier to read. 2193 // this could possibly be done in the above else-if block, but we're doing the check here to keep the code easier to read.
2214 2194
2215 Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition; 2195 Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition;
2216 LandData here = World.GetLandData((float)objectPos.X, (float)objectPos.Y); 2196 LandData here = World.GetLandData(objectPos);
2217 LandData there = World.GetLandData((float)pos.x, (float)pos.y); 2197 LandData there = World.GetLandData(pos);
2218 2198
2219 // we're only checking prim limits if it's moving to a different parcel under the assumption that if the object got onto the parcel without exceeding the prim limits. 2199 // we're only checking prim limits if it's moving to a different parcel under the assumption that if the object got onto the parcel without exceeding the prim limits.
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)
@@ -2334,26 +2316,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2334 m_host.AddScriptLPS(1); 2316 m_host.AddScriptLPS(1);
2335 2317
2336 // try to let this work as in SL... 2318 // try to let this work as in SL...
2337 if (m_host.LinkNum < 2) 2319 if (m_host.ParentID == 0)
2338 { 2320 {
2339 // Special case: If we are root, rotate complete SOG to new 2321 // special case: If we are root, rotate complete SOG to new rotation
2340 // rotation. 2322 SetRot(m_host, rot);
2341 // We are root if the link number is 0 (single prim) or 1
2342 // (root prim). ParentID may be nonzero in attachments and
2343 // using it would cause attachments and HUDs to rotate
2344 // to the wrong positions.
2345
2346 SetRot(m_host, Rot2Quaternion(rot));
2347 } 2323 }
2348 else 2324 else
2349 { 2325 {
2350 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. 2326 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
2351 SceneObjectPart rootPart; 2327 SceneObjectPart rootPart = m_host.ParentGroup.RootPart;
2352 if (m_host.ParentGroup != null) // better safe than sorry 2328 if (rootPart != null) // better safe than sorry
2353 { 2329 {
2354 rootPart = m_host.ParentGroup.RootPart; 2330 SetRot(m_host, rootPart.RotationOffset * (Quaternion)rot);
2355 if (rootPart != null)
2356 SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot));
2357 } 2331 }
2358 } 2332 }
2359 2333
@@ -2363,8 +2337,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2363 public void llSetLocalRot(LSL_Rotation rot) 2337 public void llSetLocalRot(LSL_Rotation rot)
2364 { 2338 {
2365 m_host.AddScriptLPS(1); 2339 m_host.AddScriptLPS(1);
2366 2340 SetRot(m_host, rot);
2367 SetRot(m_host, Rot2Quaternion(rot));
2368 ScriptSleep(200); 2341 ScriptSleep(200);
2369 } 2342 }
2370 2343
@@ -2476,7 +2449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2476 if (local != 0) 2449 if (local != 0)
2477 force *= llGetRot(); 2450 force *= llGetRot();
2478 2451
2479 m_host.ParentGroup.RootPart.SetForce(new Vector3((float)force.x, (float)force.y, (float)force.z)); 2452 m_host.ParentGroup.RootPart.SetForce(force);
2480 } 2453 }
2481 } 2454 }
2482 2455
@@ -2488,10 +2461,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2488 2461
2489 if (!m_host.ParentGroup.IsDeleted) 2462 if (!m_host.ParentGroup.IsDeleted)
2490 { 2463 {
2491 Vector3 tmpForce = m_host.ParentGroup.RootPart.GetForce(); 2464 force = m_host.ParentGroup.RootPart.GetForce();
2492 force.x = tmpForce.X;
2493 force.y = tmpForce.Y;
2494 force.z = tmpForce.Z;
2495 } 2465 }
2496 2466
2497 return force; 2467 return force;
@@ -2500,8 +2470,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2500 public LSL_Integer llTarget(LSL_Vector position, double range) 2470 public LSL_Integer llTarget(LSL_Vector position, double range)
2501 { 2471 {
2502 m_host.AddScriptLPS(1); 2472 m_host.AddScriptLPS(1);
2503 return m_host.ParentGroup.registerTargetWaypoint( 2473 return m_host.ParentGroup.registerTargetWaypoint(position,
2504 new Vector3((float)position.x, (float)position.y, (float)position.z), (float)range); 2474 (float)range);
2505 } 2475 }
2506 2476
2507 public void llTargetRemove(int number) 2477 public void llTargetRemove(int number)
@@ -2513,8 +2483,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2513 public LSL_Integer llRotTarget(LSL_Rotation rot, double error) 2483 public LSL_Integer llRotTarget(LSL_Rotation rot, double error)
2514 { 2484 {
2515 m_host.AddScriptLPS(1); 2485 m_host.AddScriptLPS(1);
2516 return m_host.ParentGroup.registerRotTargetWaypoint( 2486 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 } 2487 }
2519 2488
2520 public void llRotTargetRemove(int number) 2489 public void llRotTargetRemove(int number)
@@ -2526,7 +2495,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2526 public void llMoveToTarget(LSL_Vector target, double tau) 2495 public void llMoveToTarget(LSL_Vector target, double tau)
2527 { 2496 {
2528 m_host.AddScriptLPS(1); 2497 m_host.AddScriptLPS(1);
2529 m_host.MoveToTarget(new Vector3((float)target.x, (float)target.y, (float)target.z), (float)tau); 2498 m_host.MoveToTarget(target, (float)tau);
2530 } 2499 }
2531 2500
2532 public void llStopMoveToTarget() 2501 public void llStopMoveToTarget()
@@ -2539,7 +2508,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2539 { 2508 {
2540 m_host.AddScriptLPS(1); 2509 m_host.AddScriptLPS(1);
2541 //No energy force yet 2510 //No energy force yet
2542 Vector3 v = new Vector3((float)force.x, (float)force.y, (float)force.z); 2511 Vector3 v = force;
2543 if (v.Length() > 20000.0f) 2512 if (v.Length() > 20000.0f)
2544 { 2513 {
2545 v.Normalize(); 2514 v.Normalize();
@@ -2552,13 +2521,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2552 public void llApplyRotationalImpulse(LSL_Vector force, int local) 2521 public void llApplyRotationalImpulse(LSL_Vector force, int local)
2553 { 2522 {
2554 m_host.AddScriptLPS(1); 2523 m_host.AddScriptLPS(1);
2555 m_host.ParentGroup.RootPart.ApplyAngularImpulse(new Vector3((float)force.x, (float)force.y, (float)force.z), local != 0); 2524 m_host.ParentGroup.RootPart.ApplyAngularImpulse(force, local != 0);
2556 } 2525 }
2557 2526
2558 public void llSetTorque(LSL_Vector torque, int local) 2527 public void llSetTorque(LSL_Vector torque, int local)
2559 { 2528 {
2560 m_host.AddScriptLPS(1); 2529 m_host.AddScriptLPS(1);
2561 m_host.ParentGroup.RootPart.SetAngularImpulse(new Vector3((float)torque.x, (float)torque.y, (float)torque.z), local != 0); 2530 m_host.ParentGroup.RootPart.SetAngularImpulse(torque, local != 0);
2562 } 2531 }
2563 2532
2564 public LSL_Vector llGetTorque() 2533 public LSL_Vector llGetTorque()
@@ -3123,13 +3092,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3123 return; 3092 return;
3124 } 3093 }
3125 3094
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 3095 // need the magnitude later
3130 // float velmag = (float)Util.GetMagnitude(llvel); 3096 // float velmag = (float)Util.GetMagnitude(llvel);
3131 3097
3132 SceneObjectGroup new_group = World.RezObject(m_host, item, llpos, Rot2Quaternion(rot), llvel, param); 3098 SceneObjectGroup new_group = World.RezObject(m_host, item, pos, rot, vel, param);
3133 3099
3134 // If either of these are null, then there was an unknown error. 3100 // If either of these are null, then there was an unknown error.
3135 if (new_group == null) 3101 if (new_group == null)
@@ -3156,11 +3122,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3156 3122
3157 PhysicsActor pa = new_group.RootPart.PhysActor; 3123 PhysicsActor pa = new_group.RootPart.PhysActor;
3158 3124
3159 if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) 3125 if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero)
3160 { 3126 {
3161 float groupmass = new_group.GetMass(); 3127 float groupmass = new_group.GetMass();
3162 llvel *= -groupmass; 3128 vel *= -groupmass;
3163 llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0); 3129 llApplyImpulse(vel, 0);
3164 } 3130 }
3165 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) 3131 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3166 return; 3132 return;
@@ -3211,7 +3177,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3211 return; 3177 return;
3212 } 3178 }
3213 3179
3214 m_host.StartLookAt(Rot2Quaternion(r3 * r2 * r1), (float)strength, (float)damping); 3180 m_host.StartLookAt((Quaternion)(r3 * r2 * r1), (float)strength, (float)damping);
3215 } 3181 }
3216 } 3182 }
3217 3183
@@ -3637,7 +3603,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3637 } 3603 }
3638 else 3604 else
3639 { 3605 {
3640 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping); 3606 m_host.RotLookAt(target, (float)strength, (float)damping);
3641 } 3607 }
3642 } 3608 }
3643 3609
@@ -3718,7 +3684,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3718 3684
3719 protected void TargetOmega(SceneObjectPart part, LSL_Vector axis, double spinrate, double gain) 3685 protected void TargetOmega(SceneObjectPart part, LSL_Vector axis, double spinrate, double gain)
3720 { 3686 {
3721 part.UpdateAngularVelocity(new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate))); 3687 part.UpdateAngularVelocity(axis * spinrate);
3722 } 3688 }
3723 3689
3724 public LSL_Integer llGetStartParameter() 3690 public LSL_Integer llGetStartParameter()
@@ -3928,7 +3894,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3928 try 3894 try
3929 { 3895 {
3930 foreach (SceneObjectPart part in parts) 3896 foreach (SceneObjectPart part in parts)
3931 part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); 3897 part.SetFaceColorAlpha(face, color, null);
3932 } 3898 }
3933 finally 3899 finally
3934 { 3900 {
@@ -4398,9 +4364,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4398 public void llSetText(string text, LSL_Vector color, double alpha) 4364 public void llSetText(string text, LSL_Vector color, double alpha)
4399 { 4365 {
4400 m_host.AddScriptLPS(1); 4366 m_host.AddScriptLPS(1);
4401 Vector3 av3 = new Vector3(Util.Clip((float)color.x, 0.0f, 1.0f), 4367 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)); 4368 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; 4369 //m_host.ParentGroup.HasGroupChanged = true;
4406 //m_host.ParentGroup.ScheduleGroupForFullUpdate(); 4370 //m_host.ParentGroup.ScheduleGroupForFullUpdate();
@@ -4616,14 +4580,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4616 ScriptSleep(5000); 4580 ScriptSleep(5000);
4617 } 4581 }
4618 4582
4619 public void llTeleportAgent(string agent, string destination, LSL_Vector pos, LSL_Vector lookAt) 4583 public void llTeleportAgent(string agent, string destination, LSL_Vector targetPos, LSL_Vector targetLookAt)
4620 { 4584 {
4621 m_host.AddScriptLPS(1); 4585 m_host.AddScriptLPS(1);
4622 UUID agentId = new UUID(); 4586 UUID agentId = new UUID();
4623 4587
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)) 4588 if (UUID.TryParse(agent, out agentId))
4628 { 4589 {
4629 ScenePresence presence = World.GetScenePresence(agentId); 4590 ScenePresence presence = World.GetScenePresence(agentId);
@@ -4652,15 +4613,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4652 } 4613 }
4653 } 4614 }
4654 4615
4655 public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector pos, LSL_Vector lookAt) 4616 public void llTeleportAgentGlobalCoords(string agent, LSL_Vector global_coords, LSL_Vector targetPos, LSL_Vector targetLookAt)
4656 { 4617 {
4657 m_host.AddScriptLPS(1); 4618 m_host.AddScriptLPS(1);
4658 UUID agentId = new UUID(); 4619 UUID agentId = new UUID();
4659 4620
4660 ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y); 4621 ulong regionHandle = Utils.UIntsToLong((uint)global_coords.x, (uint)global_coords.y);
4661 4622
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)) 4623 if (UUID.TryParse(agent, out agentId))
4665 { 4624 {
4666 ScenePresence presence = World.GetScenePresence(agentId); 4625 ScenePresence presence = World.GetScenePresence(agentId);
@@ -4957,7 +4916,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4957 distance_attenuation = 1f / normalized_units; 4916 distance_attenuation = 1f / normalized_units;
4958 } 4917 }
4959 4918
4960 Vector3 applied_linear_impulse = new Vector3((float)impulse.x, (float)impulse.y, (float)impulse.z); 4919 Vector3 applied_linear_impulse = impulse;
4961 { 4920 {
4962 float impulse_length = applied_linear_impulse.Length(); 4921 float impulse_length = applied_linear_impulse.Length();
4963 4922
@@ -5605,25 +5564,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5605 /// separated list. There is a space after 5564 /// separated list. There is a space after
5606 /// each comma. 5565 /// each comma.
5607 /// </summary> 5566 /// </summary>
5608
5609 public LSL_String llList2CSV(LSL_List src) 5567 public LSL_String llList2CSV(LSL_List src)
5610 { 5568 {
5611
5612 string ret = String.Empty;
5613 int x = 0;
5614
5615 m_host.AddScriptLPS(1); 5569 m_host.AddScriptLPS(1);
5616 5570
5617 if (src.Data.Length > 0) 5571 return string.Join(", ",
5618 { 5572 (new List<object>(src.Data)).ConvertAll<string>(o =>
5619 ret = src.Data[x++].ToString(); 5573 {
5620 for (; x < src.Data.Length; x++) 5574 return o.ToString();
5621 { 5575 }).ToArray());
5622 ret += ", "+src.Data[x].ToString();
5623 }
5624 }
5625
5626 return ret;
5627 } 5576 }
5628 5577
5629 /// <summary> 5578 /// <summary>
@@ -6296,19 +6245,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6296 m_host.AddScriptLPS(1); 6245 m_host.AddScriptLPS(1);
6297 6246
6298 List<SceneObjectPart> parts = GetLinkParts(linknumber); 6247 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6299 if (parts.Count > 0) 6248
6249 try
6300 { 6250 {
6301 try 6251 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 { 6252 {
6253 SetTextureAnim(part, mode, face, sizex, sizey, start, length, rate);
6310 } 6254 }
6311 } 6255 }
6256 finally
6257 {
6258 }
6312 } 6259 }
6313 6260
6314 private void SetTextureAnim(SceneObjectPart part, int mode, int face, int sizex, int sizey, double start, double length, double rate) 6261 private void SetTextureAnim(SceneObjectPart part, int mode, int face, int sizex, int sizey, double start, double length, double rate)
@@ -6526,9 +6473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6526 6473
6527 //Plug the x,y coordinates of the slope normal into the equation of the plane to get 6474 //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. 6475 //the height of that point on the plane. The resulting vector gives the slope.
6529 Vector3 vsl = new Vector3(); 6476 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)); 6477 vsl.Z = (float)(((vsn.x * vsn.x) + (vsn.y * vsn.y)) / (-1 * vsn.z));
6533 vsl.Normalize(); 6478 vsl.Normalize();
6534 //Normalization might be overkill here 6479 //Normalization might be overkill here
@@ -6539,9 +6484,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6539 public LSL_Vector llGroundNormal(LSL_Vector offset) 6484 public LSL_Vector llGroundNormal(LSL_Vector offset)
6540 { 6485 {
6541 m_host.AddScriptLPS(1); 6486 m_host.AddScriptLPS(1);
6542 Vector3 pos = m_host.GetWorldPosition() + new Vector3((float)offset.x, 6487 Vector3 pos = m_host.GetWorldPosition() + (Vector3)offset;
6543 (float)offset.y,
6544 (float)offset.z);
6545 // Clamp to valid position 6488 // Clamp to valid position
6546 if (pos.X < 0) 6489 if (pos.X < 0)
6547 pos.X = 0; 6490 pos.X = 0;
@@ -6706,7 +6649,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6706 6649
6707 List<SceneObjectPart> parts = GetLinkParts(linknumber); 6650 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6708 6651
6709 foreach (var part in parts) 6652 foreach (SceneObjectPart part in parts)
6710 { 6653 {
6711 SetParticleSystem(part, rules); 6654 SetParticleSystem(part, rules);
6712 } 6655 }
@@ -6995,8 +6938,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6995 6938
6996 if (!m_host.ParentGroup.IsDeleted) 6939 if (!m_host.ParentGroup.IsDeleted)
6997 { 6940 {
6998 m_host.ParentGroup.RootPart.SetVehicleVectorParam(param, 6941 m_host.ParentGroup.RootPart.SetVehicleVectorParam(param, vec);
6999 new Vector3((float)vec.x, (float)vec.y, (float)vec.z));
7000 } 6942 }
7001 } 6943 }
7002 6944
@@ -7008,7 +6950,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7008 6950
7009 if (!m_host.ParentGroup.IsDeleted) 6951 if (!m_host.ParentGroup.IsDeleted)
7010 { 6952 {
7011 m_host.ParentGroup.RootPart.SetVehicleRotationParam(param, Rot2Quaternion(rot)); 6953 m_host.ParentGroup.RootPart.SetVehicleRotationParam(param, rot);
7012 } 6954 }
7013 } 6955 }
7014 6956
@@ -7038,8 +6980,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7038 if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) 6980 if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0)
7039 rot.s = 1; // ZERO_ROTATION = 0,0,0,1 6981 rot.s = 1; // ZERO_ROTATION = 0,0,0,1
7040 6982
7041 part.SitTargetPosition = new Vector3((float)offset.x, (float)offset.y, (float)offset.z); 6983 part.SitTargetPosition = offset;
7042 part.SitTargetOrientation = Rot2Quaternion(rot); 6984 part.SitTargetOrientation = rot;
7043 part.ParentGroup.HasGroupChanged = true; 6985 part.ParentGroup.HasGroupChanged = true;
7044 } 6986 }
7045 6987
@@ -7142,13 +7084,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7142 public void llSetCameraEyeOffset(LSL_Vector offset) 7084 public void llSetCameraEyeOffset(LSL_Vector offset)
7143 { 7085 {
7144 m_host.AddScriptLPS(1); 7086 m_host.AddScriptLPS(1);
7145 m_host.SetCameraEyeOffset(new Vector3((float)offset.x, (float)offset.y, (float)offset.z)); 7087 m_host.SetCameraEyeOffset(offset);
7146 } 7088 }
7147 7089
7148 public void llSetCameraAtOffset(LSL_Vector offset) 7090 public void llSetCameraAtOffset(LSL_Vector offset)
7149 { 7091 {
7150 m_host.AddScriptLPS(1); 7092 m_host.AddScriptLPS(1);
7151 m_host.SetCameraAtOffset(new Vector3((float)offset.x, (float)offset.y, (float)offset.z)); 7093 m_host.SetCameraAtOffset(offset);
7152 } 7094 }
7153 7095
7154 public LSL_String llDumpList2String(LSL_List src, string seperator) 7096 public LSL_String llDumpList2String(LSL_List src, string seperator)
@@ -7170,7 +7112,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7170 public LSL_Integer llScriptDanger(LSL_Vector pos) 7112 public LSL_Integer llScriptDanger(LSL_Vector pos)
7171 { 7113 {
7172 m_host.AddScriptLPS(1); 7114 m_host.AddScriptLPS(1);
7173 bool result = World.ScriptDanger(m_host.LocalId, new Vector3((float)pos.x, (float)pos.y, (float)pos.z)); 7115 bool result = World.ScriptDanger(m_host.LocalId, pos);
7174 if (result) 7116 if (result)
7175 { 7117 {
7176 return 1; 7118 return 1;
@@ -7752,7 +7694,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7752 { 7694 {
7753 m_host.AddScriptLPS(1); 7695 m_host.AddScriptLPS(1);
7754 7696
7755 setLinkPrimParams(ScriptBaseClass.LINK_THIS, rules); 7697 setLinkPrimParams(ScriptBaseClass.LINK_THIS, rules, "llSetPrimitiveParams");
7756 7698
7757 ScriptSleep(200); 7699 ScriptSleep(200);
7758 } 7700 }
@@ -7761,10 +7703,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7761 { 7703 {
7762 m_host.AddScriptLPS(1); 7704 m_host.AddScriptLPS(1);
7763 7705
7764 setLinkPrimParams(linknumber, rules); 7706 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParamsFast");
7707
7708 ScriptSleep(200);
7765 } 7709 }
7766 7710
7767 private void setLinkPrimParams(int linknumber, LSL_List rules) 7711 private void setLinkPrimParams(int linknumber, LSL_List rules, string originFunc)
7768 { 7712 {
7769 List<object> parts = new List<object>(); 7713 List<object> parts = new List<object>();
7770 List<SceneObjectPart> prims = GetLinkParts(linknumber); 7714 List<SceneObjectPart> prims = GetLinkParts(linknumber);
@@ -7775,15 +7719,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7775 parts.Add(p); 7719 parts.Add(p);
7776 7720
7777 LSL_List remaining = null; 7721 LSL_List remaining = null;
7722 uint rulesParsed = 0;
7778 7723
7779 if (parts.Count > 0) 7724 if (parts.Count > 0)
7780 { 7725 {
7781 foreach (object part in parts) 7726 foreach (object part in parts)
7782 { 7727 {
7783 if (part is SceneObjectPart) 7728 if (part is SceneObjectPart)
7784 remaining = SetPrimParams((SceneObjectPart)part, rules); 7729 remaining = SetPrimParams((SceneObjectPart)part, rules, originFunc, ref rulesParsed);
7785 else 7730 else
7786 remaining = SetPrimParams((ScenePresence)part, rules); 7731 remaining = SetPrimParams((ScenePresence)part, rules, originFunc, ref rulesParsed);
7787 } 7732 }
7788 7733
7789 while ((object)remaining != null && remaining.Length > 2) 7734 while ((object)remaining != null && remaining.Length > 2)
@@ -7802,9 +7747,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7802 foreach (object part in parts) 7747 foreach (object part in parts)
7803 { 7748 {
7804 if (part is SceneObjectPart) 7749 if (part is SceneObjectPart)
7805 remaining = SetPrimParams((SceneObjectPart)part, rules); 7750 remaining = SetPrimParams((SceneObjectPart)part, rules, originFunc, ref rulesParsed);
7806 else 7751 else
7807 remaining = SetPrimParams((ScenePresence)part, rules); 7752 remaining = SetPrimParams((ScenePresence)part, rules, originFunc, ref rulesParsed);
7808 } 7753 }
7809 } 7754 }
7810 } 7755 }
@@ -7842,6 +7787,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7842 7787
7843 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) 7788 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
7844 { 7789 {
7790 setLinkPrimParams(linknumber, rules, "llSetLinkPrimitiveParams");
7845 llSetLinkPrimitiveParamsFast(linknumber, rules); 7791 llSetLinkPrimitiveParamsFast(linknumber, rules);
7846 ScriptSleep(200); 7792 ScriptSleep(200);
7847 } 7793 }
@@ -7869,195 +7815,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7869 return new Vector3((float)x, (float)y, (float)z); 7815 return new Vector3((float)x, (float)y, (float)z);
7870 } 7816 }
7871 7817
7872 protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules) 7818 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 { 7819 {
8057 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 7820 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
8058 return null; 7821 return null;
8059 7822
8060 int idx = 0; 7823 int idx = 0;
7824 int idxStart = 0;
8061 7825
8062 SceneObjectGroup parentgrp = part.ParentGroup; 7826 SceneObjectGroup parentgrp = part.ParentGroup;
8063 7827
@@ -8068,9 +7832,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8068 { 7832 {
8069 while (idx < rules.Length) 7833 while (idx < rules.Length)
8070 { 7834 {
7835 ++rulesParsed;
8071 int code = rules.GetLSLIntegerItem(idx++); 7836 int code = rules.GetLSLIntegerItem(idx++);
8072 7837
8073 int remain = rules.Length - idx; 7838 int remain = rules.Length - idx;
7839 idxStart = idx;
8074 7840
8075 int face; 7841 int face;
8076 LSL_Vector v; 7842 LSL_Vector v;
@@ -8100,18 +7866,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8100 return null; 7866 return null;
8101 7867
8102 LSL_Rotation q = rules.GetQuaternionItem(idx++); 7868 LSL_Rotation q = rules.GetQuaternionItem(idx++);
8103 SceneObjectPart rootPart = parentgrp.RootPart;
8104 // try to let this work as in SL... 7869 // try to let this work as in SL...
8105 if (rootPart == part) 7870 if (part.ParentID == 0)
8106 { 7871 {
8107 // special case: If we are root, rotate complete SOG to new rotation 7872 // special case: If we are root, rotate complete SOG to new rotation
8108 SetRot(part, Rot2Quaternion(q)); 7873 SetRot(part, q);
8109 } 7874 }
8110 else 7875 else
8111 { 7876 {
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. 7877 // 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 7878 SceneObjectPart rootPart = part.ParentGroup.RootPart;
8114 SetRot(part, rootPart.RotationOffset * Rot2Quaternion(q)); 7879 SetRot(part, rootPart.RotationOffset * (Quaternion)q);
8115 } 7880 }
8116 7881
8117 break; 7882 break;
@@ -8285,8 +8050,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8285 LSL_Vector color=rules.GetVector3Item(idx++); 8050 LSL_Vector color=rules.GetVector3Item(idx++);
8286 double alpha=(double)rules.GetLSLFloatItem(idx++); 8051 double alpha=(double)rules.GetLSLFloatItem(idx++);
8287 8052
8288 part.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); 8053 part.SetFaceColorAlpha(face, color, alpha);
8289 SetAlpha(part, alpha, face);
8290 8054
8291 break; 8055 break;
8292 8056
@@ -8434,9 +8198,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8434 string primText = rules.GetLSLStringItem(idx++); 8198 string primText = rules.GetLSLStringItem(idx++);
8435 LSL_Vector primTextColor = rules.GetVector3Item(idx++); 8199 LSL_Vector primTextColor = rules.GetVector3Item(idx++);
8436 LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++); 8200 LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++);
8437 Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f), 8201 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)); 8202 part.SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f));
8441 8203
8442 break; 8204 break;
@@ -8455,8 +8217,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8455 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 8217 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
8456 if (remain < 1) 8218 if (remain < 1)
8457 return null; 8219 return null;
8458 LSL_Rotation lr = rules.GetQuaternionItem(idx++); 8220 SetRot(part, rules.GetQuaternionItem(idx++));
8459 SetRot(part, Rot2Quaternion(lr));
8460 break; 8221 break;
8461 case (int)ScriptBaseClass.PRIM_OMEGA: 8222 case (int)ScriptBaseClass.PRIM_OMEGA:
8462 if (remain < 3) 8223 if (remain < 3)
@@ -8466,7 +8227,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8466 LSL_Float gain = rules.GetLSLFloatItem(idx++); 8227 LSL_Float gain = rules.GetLSLFloatItem(idx++);
8467 TargetOmega(part, axis, (double)spinrate, (double)gain); 8228 TargetOmega(part, axis, (double)spinrate, (double)gain);
8468 break; 8229 break;
8469 8230 case (int)ScriptBaseClass.PRIM_SLICE:
8231 if (remain < 1)
8232 return null;
8233 LSL_Vector slice = rules.GetVector3Item(idx++);
8234 part.UpdateSlice((float)slice.x, (float)slice.y);
8235 break;
8470 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 8236 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. 8237 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; 8238 return null;
@@ -8475,6 +8241,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8475 } 8241 }
8476 } 8242 }
8477 } 8243 }
8244 catch (InvalidCastException e)
8245 {
8246 ShoutError(string.Format(
8247 "{0} error running rule #{1}: arg #{2} ",
8248 originFunc, rulesParsed, idx - idxStart) + e.Message);
8249 }
8478 finally 8250 finally
8479 { 8251 {
8480 if (positionChanged) 8252 if (positionChanged)
@@ -8483,12 +8255,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8483 { 8255 {
8484 SceneObjectGroup parent = part.ParentGroup; 8256 SceneObjectGroup parent = part.ParentGroup;
8485 Util.FireAndForget(delegate(object x) { 8257 Util.FireAndForget(delegate(object x) {
8486 parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z)); 8258 parent.UpdateGroupPosition(currentPosition);
8487 }); 8259 });
8488 } 8260 }
8489 else 8261 else
8490 { 8262 {
8491 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z); 8263 part.OffsetPosition = currentPosition;
8492 SceneObjectGroup parent = part.ParentGroup; 8264 SceneObjectGroup parent = part.ParentGroup;
8493 parent.HasGroupChanged = true; 8265 parent.HasGroupChanged = true;
8494 parent.ScheduleGroupForTerseUpdate(); 8266 parent.ScheduleGroupForTerseUpdate();
@@ -8866,7 +8638,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8866 public LSL_List llGetPrimitiveParams(LSL_List rules) 8638 public LSL_List llGetPrimitiveParams(LSL_List rules)
8867 { 8639 {
8868 m_host.AddScriptLPS(1); 8640 m_host.AddScriptLPS(1);
8869 return GetLinkPrimitiveParams(m_host, rules); 8641
8642 LSL_List result = new LSL_List();
8643
8644 LSL_List remaining = GetPrimParams(m_host, rules, ref result);
8645
8646 while (remaining != null && remaining.Length > 2)
8647 {
8648 int linknumber = remaining.GetLSLIntegerItem(0);
8649 rules = remaining.GetSublist(1, -1);
8650 List<SceneObjectPart> parts = GetLinkParts(linknumber);
8651
8652 foreach (SceneObjectPart part in parts)
8653 remaining = GetPrimParams(part, rules, ref result);
8654 }
8655
8656 return result;
8870 } 8657 }
8871 8658
8872 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules) 8659 public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules)
@@ -8876,294 +8663,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. 8663 // acording to SL wiki this must indicate a single link number or link_root or link_this.
8877 // keep other options as before 8664 // keep other options as before
8878 8665
8879 List<SceneObjectPart> parts = GetLinkParts(linknumber); 8666 List<SceneObjectPart> parts;
8880 List<ScenePresence> avatars = GetLinkAvatars(linknumber); 8667 List<ScenePresence> avatars;
8881 8668
8882 LSL_List res = new LSL_List(); 8669 LSL_List res = new LSL_List();
8670 LSL_List remaining = null;
8883 8671
8884 if (parts.Count > 0) 8672 while (rules.Length > 0)
8885 { 8673 {
8886 foreach (var part in parts) 8674 parts = GetLinkParts(linknumber);
8675 avatars = GetLinkAvatars(linknumber);
8676
8677 remaining = null;
8678 foreach (SceneObjectPart part in parts)
8887 { 8679 {
8888 LSL_List partRes = GetLinkPrimitiveParams(part, rules); 8680 remaining = GetPrimParams(part, rules, ref res);
8889 res += partRes;
8890 } 8681 }
8891 }
8892 if (avatars.Count > 0)
8893 {
8894 foreach (ScenePresence avatar in avatars) 8682 foreach (ScenePresence avatar in avatars)
8895 { 8683 {
8896 LSL_List avaRes = GetLinkPrimitiveParams(avatar, rules); 8684 remaining = GetPrimParams(avatar, rules, ref res);
8897 res += avaRes;
8898 } 8685 }
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 8686
8912 int idx = 0; 8687 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 { 8688 {
8920 case (int)ScriptBaseClass.PRIM_MATERIAL: 8689 linknumber = remaining.GetLSLIntegerItem(0);
8921 res.Add(new LSL_Integer((int)SOPMaterialData.SopMaterial.Flesh)); 8690 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 } 8691 }
9160 } 8692 }
8693
9161 return res; 8694 return res;
9162 } 8695 }
9163 8696
9164 public LSL_List GetLinkPrimitiveParams(SceneObjectPart part, LSL_List rules) 8697 public LSL_List GetPrimParams(SceneObjectPart part, LSL_List rules, ref LSL_List res)
9165 { 8698 {
9166 LSL_List res = new LSL_List();
9167 int idx=0; 8699 int idx=0;
9168 while (idx < rules.Length) 8700 while (idx < rules.Length)
9169 { 8701 {
@@ -9301,7 +8833,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9301 8833
9302 case (int)ScriptBaseClass.PRIM_TEXTURE: 8834 case (int)ScriptBaseClass.PRIM_TEXTURE:
9303 if (remain < 1) 8835 if (remain < 1)
9304 return res; 8836 return null;
9305 8837
9306 int face = (int)rules.GetLSLIntegerItem(idx++); 8838 int face = (int)rules.GetLSLIntegerItem(idx++);
9307 Primitive.TextureEntry tex = part.Shape.Textures; 8839 Primitive.TextureEntry tex = part.Shape.Textures;
@@ -9341,7 +8873,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9341 8873
9342 case (int)ScriptBaseClass.PRIM_COLOR: 8874 case (int)ScriptBaseClass.PRIM_COLOR:
9343 if (remain < 1) 8875 if (remain < 1)
9344 return res; 8876 return null;
9345 8877
9346 face=(int)rules.GetLSLIntegerItem(idx++); 8878 face=(int)rules.GetLSLIntegerItem(idx++);
9347 8879
@@ -9370,7 +8902,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9370 8902
9371 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 8903 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
9372 if (remain < 1) 8904 if (remain < 1)
9373 return res; 8905 return null;
8906
9374 face = (int)rules.GetLSLIntegerItem(idx++); 8907 face = (int)rules.GetLSLIntegerItem(idx++);
9375 8908
9376 tex = part.Shape.Textures; 8909 tex = part.Shape.Textures;
@@ -9426,7 +8959,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9426 8959
9427 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 8960 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
9428 if (remain < 1) 8961 if (remain < 1)
9429 return res; 8962 return null;
8963
9430 face = (int)rules.GetLSLIntegerItem(idx++); 8964 face = (int)rules.GetLSLIntegerItem(idx++);
9431 8965
9432 tex = part.Shape.Textures; 8966 tex = part.Shape.Textures;
@@ -9480,7 +9014,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9480 case (int)ScriptBaseClass.PRIM_TEXGEN: 9014 case (int)ScriptBaseClass.PRIM_TEXGEN:
9481 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR) 9015 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
9482 if (remain < 1) 9016 if (remain < 1)
9483 return res; 9017 return null;
9018
9484 face = (int)rules.GetLSLIntegerItem(idx++); 9019 face = (int)rules.GetLSLIntegerItem(idx++);
9485 9020
9486 tex = part.Shape.Textures; 9021 tex = part.Shape.Textures;
@@ -9528,7 +9063,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9528 9063
9529 case (int)ScriptBaseClass.PRIM_GLOW: 9064 case (int)ScriptBaseClass.PRIM_GLOW:
9530 if (remain < 1) 9065 if (remain < 1)
9531 return res; 9066 return null;
9067
9532 face = (int)rules.GetLSLIntegerItem(idx++); 9068 face = (int)rules.GetLSLIntegerItem(idx++);
9533 9069
9534 tex = part.Shape.Textures; 9070 tex = part.Shape.Textures;
@@ -9572,18 +9108,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9572 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 9108 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
9573 res.Add(new LSL_Vector(GetPartLocalPos(part))); 9109 res.Add(new LSL_Vector(GetPartLocalPos(part)));
9574 break; 9110 break;
9575 9111 case (int)ScriptBaseClass.PRIM_SLICE:
9112 PrimType prim_type = part.GetPrimType();
9113 bool useProfileBeginEnd = (prim_type == PrimType.SPHERE || prim_type == PrimType.TORUS || prim_type == PrimType.TUBE || prim_type == PrimType.RING);
9114 res.Add(new LSL_Vector(
9115 (useProfileBeginEnd ? part.Shape.ProfileBegin : part.Shape.PathBegin) / 50000.0,
9116 1 - (useProfileBeginEnd ? part.Shape.ProfileEnd : part.Shape.PathEnd) / 50000.0,
9117 0
9118 ));
9119 break;
9576 case (int)ScriptBaseClass.PRIM_LINK_TARGET: 9120 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. 9121 if(remain < 3)
9578 return res; 9122 return null;
9579 LSL_Integer new_linknumber = rules.GetLSLIntegerItem(idx++); 9123
9580 LSL_List new_rules = rules.GetSublist(idx, -1); 9124 return rules.GetSublist(idx, -1);
9581 LSL_List tres = llGetLinkPrimitiveParams((int)new_linknumber, new_rules);
9582 res += tres;
9583 return res;
9584 } 9125 }
9585 } 9126 }
9586 return res; 9127
9128 return null;
9587 } 9129 }
9588 9130
9589 public LSL_List llGetPrimMediaParams(int face, LSL_List rules) 9131 public LSL_List llGetPrimMediaParams(int face, LSL_List rules)
@@ -10983,20 +10525,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10983 switch ((ParcelMediaCommandEnum) Convert.ToInt32(aList.Data[i].ToString())) 10525 switch ((ParcelMediaCommandEnum) Convert.ToInt32(aList.Data[i].ToString()))
10984 { 10526 {
10985 case ParcelMediaCommandEnum.Url: 10527 case ParcelMediaCommandEnum.Url:
10986 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaURL)); 10528 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaURL));
10987 break; 10529 break;
10988 case ParcelMediaCommandEnum.Desc: 10530 case ParcelMediaCommandEnum.Desc:
10989 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).Description)); 10531 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).Description));
10990 break; 10532 break;
10991 case ParcelMediaCommandEnum.Texture: 10533 case ParcelMediaCommandEnum.Texture:
10992 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaID.ToString())); 10534 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaID.ToString()));
10993 break; 10535 break;
10994 case ParcelMediaCommandEnum.Type: 10536 case ParcelMediaCommandEnum.Type:
10995 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaType)); 10537 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaType));
10996 break; 10538 break;
10997 case ParcelMediaCommandEnum.Size: 10539 case ParcelMediaCommandEnum.Size:
10998 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaWidth)); 10540 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaWidth));
10999 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).MediaHeight)); 10541 list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaHeight));
11000 break; 10542 break;
11001 default: 10543 default:
11002 ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url; 10544 ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url;
@@ -11166,9 +10708,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11166 ScenePresence avatar = World.GetScenePresence(detectedParams.Key); 10708 ScenePresence avatar = World.GetScenePresence(detectedParams.Key);
11167 if (avatar != null) 10709 if (avatar != null)
11168 { 10710 {
11169 avatar.ControllingClient.SendScriptTeleportRequest(m_host.Name, simname, 10711 avatar.ControllingClient.SendScriptTeleportRequest(m_host.Name,
11170 new Vector3((float)pos.x, (float)pos.y, (float)pos.z), 10712 simname, pos, lookAt);
11171 new Vector3((float)lookAt.x, (float)lookAt.y, (float)lookAt.z));
11172 } 10713 }
11173 10714
11174 ScriptSleep(1000); 10715 ScriptSleep(1000);
@@ -11353,31 +10894,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11353 public LSL_Float llListStatistics(int operation, LSL_List src) 10894 public LSL_Float llListStatistics(int operation, LSL_List src)
11354 { 10895 {
11355 m_host.AddScriptLPS(1); 10896 m_host.AddScriptLPS(1);
11356 LSL_List nums = LSL_List.ToDoubleList(src);
11357 switch (operation) 10897 switch (operation)
11358 { 10898 {
11359 case ScriptBaseClass.LIST_STAT_RANGE: 10899 case ScriptBaseClass.LIST_STAT_RANGE:
11360 return nums.Range(); 10900 return src.Range();
11361 case ScriptBaseClass.LIST_STAT_MIN: 10901 case ScriptBaseClass.LIST_STAT_MIN:
11362 return nums.Min(); 10902 return src.Min();
11363 case ScriptBaseClass.LIST_STAT_MAX: 10903 case ScriptBaseClass.LIST_STAT_MAX:
11364 return nums.Max(); 10904 return src.Max();
11365 case ScriptBaseClass.LIST_STAT_MEAN: 10905 case ScriptBaseClass.LIST_STAT_MEAN:
11366 return nums.Mean(); 10906 return src.Mean();
11367 case ScriptBaseClass.LIST_STAT_MEDIAN: 10907 case ScriptBaseClass.LIST_STAT_MEDIAN:
11368 return nums.Median(); 10908 return LSL_List.ToDoubleList(src).Median();
11369 case ScriptBaseClass.LIST_STAT_NUM_COUNT: 10909 case ScriptBaseClass.LIST_STAT_NUM_COUNT:
11370 return nums.NumericLength(); 10910 return src.NumericLength();
11371 case ScriptBaseClass.LIST_STAT_STD_DEV: 10911 case ScriptBaseClass.LIST_STAT_STD_DEV:
11372 return nums.StdDev(); 10912 return src.StdDev();
11373 case ScriptBaseClass.LIST_STAT_SUM: 10913 case ScriptBaseClass.LIST_STAT_SUM:
11374 return nums.Sum(); 10914 return src.Sum();
11375 case ScriptBaseClass.LIST_STAT_SUM_SQUARES: 10915 case ScriptBaseClass.LIST_STAT_SUM_SQUARES:
11376 return nums.SumSqrs(); 10916 return src.SumSqrs();
11377 case ScriptBaseClass.LIST_STAT_GEOMETRIC_MEAN: 10917 case ScriptBaseClass.LIST_STAT_GEOMETRIC_MEAN:
11378 return nums.GeometricMean(); 10918 return src.GeometricMean();
11379 case ScriptBaseClass.LIST_STAT_HARMONIC_MEAN: 10919 case ScriptBaseClass.LIST_STAT_HARMONIC_MEAN:
11380 return nums.HarmonicMean(); 10920 return src.HarmonicMean();
11381 default: 10921 default:
11382 return 0.0; 10922 return 0.0;
11383 } 10923 }
@@ -11735,7 +11275,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11735 public LSL_List llGetParcelDetails(LSL_Vector pos, LSL_List param) 11275 public LSL_List llGetParcelDetails(LSL_Vector pos, LSL_List param)
11736 { 11276 {
11737 m_host.AddScriptLPS(1); 11277 m_host.AddScriptLPS(1);
11738 LandData land = World.GetLandData((float)pos.x, (float)pos.y); 11278 LandData land = World.GetLandData(pos);
11739 if (land == null) 11279 if (land == null)
11740 { 11280 {
11741 return new LSL_List(0); 11281 return new LSL_List(0);
@@ -11903,13 +11443,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11903 else 11443 else
11904 rot = obj.GetWorldRotation(); 11444 rot = obj.GetWorldRotation();
11905 11445
11906 LSL_Rotation objrot = new LSL_Rotation(rot.X, rot.Y, rot.Z, rot.W); 11446 LSL_Rotation objrot = new LSL_Rotation(rot);
11907 ret.Add(objrot); 11447 ret.Add(objrot);
11908 } 11448 }
11909 break; 11449 break;
11910 case ScriptBaseClass.OBJECT_VELOCITY: 11450 case ScriptBaseClass.OBJECT_VELOCITY:
11911 Vector3 ovel = obj.Velocity; 11451 ret.Add(new LSL_Vector(obj.Velocity));
11912 ret.Add(new LSL_Vector(ovel.X, ovel.Y, ovel.Z));
11913 break; 11452 break;
11914 case ScriptBaseClass.OBJECT_OWNER: 11453 case ScriptBaseClass.OBJECT_OWNER:
11915 ret.Add(new LSL_String(obj.OwnerID.ToString())); 11454 ret.Add(new LSL_String(obj.OwnerID.ToString()));
@@ -12122,7 +11661,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12122 return tid.ToString(); 11661 return tid.ToString();
12123 } 11662 }
12124 11663
12125 public void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules) 11664 public void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc)
12126 { 11665 {
12127 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim)); 11666 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim));
12128 if (obj == null) 11667 if (obj == null)
@@ -12131,28 +11670,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12131 if (obj.OwnerID != m_host.OwnerID) 11670 if (obj.OwnerID != m_host.OwnerID)
12132 return; 11671 return;
12133 11672
12134 LSL_List remaining = SetPrimParams(obj, rules); 11673 uint rulesParsed = 0;
11674 LSL_List remaining = SetPrimParams(obj, rules, originFunc, ref rulesParsed);
12135 11675
12136 while ((object)remaining != null && remaining.Length > 2) 11676 while ((object)remaining != null && remaining.Length > 2)
12137 { 11677 {
12138 LSL_Integer newLink = remaining.GetLSLIntegerItem(0); 11678 LSL_Integer newLink = remaining.GetLSLIntegerItem(0);
12139 LSL_List newrules = remaining.GetSublist(1, -1); 11679 LSL_List newrules = remaining.GetSublist(1, -1);
12140 foreach(SceneObjectPart part in GetLinkParts(obj, newLink)){ 11680 foreach(SceneObjectPart part in GetLinkParts(obj, newLink)){
12141 remaining = SetPrimParams(part, newrules); 11681 remaining = SetPrimParams(part, newrules, originFunc, ref rulesParsed);
12142 } 11682 }
12143 } 11683 }
12144 } 11684 }
12145 11685
12146 public LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules) 11686 public LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules)
12147 { 11687 {
12148 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim)); 11688 SceneObjectPart obj = World.GetSceneObjectPart(new UUID(prim));
12149 if (obj == null)
12150 return new LSL_List();
12151 11689
12152 if (obj.OwnerID != m_host.OwnerID) 11690 LSL_List result = new LSL_List();
12153 return new LSL_List(); 11691
11692 if (obj != null && obj.OwnerID != m_host.OwnerID)
11693 {
11694 LSL_List remaining = GetPrimParams(obj, rules, ref result);
11695
11696 while (remaining != null && remaining.Length > 2)
11697 {
11698 int linknumber = remaining.GetLSLIntegerItem(0);
11699 rules = remaining.GetSublist(1, -1);
11700 List<SceneObjectPart> parts = GetLinkParts(linknumber);
11701
11702 foreach (SceneObjectPart part in parts)
11703 remaining = GetPrimParams(part, rules, ref result);
11704 }
11705 }
12154 11706
12155 return GetLinkPrimitiveParams(obj, rules); 11707 return result;
12156 } 11708 }
12157 11709
12158 public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link) 11710 public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
@@ -12515,8 +12067,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12515 12067
12516 m_host.AddScriptLPS(1); 12068 m_host.AddScriptLPS(1);
12517 12069
12518 Vector3 rayStart = new Vector3((float)start.x, (float)start.y, (float)start.z); 12070 Vector3 rayStart = start;
12519 Vector3 rayEnd = new Vector3((float)end.x, (float)end.y, (float)end.z); 12071 Vector3 rayEnd = end;
12520 Vector3 dir = rayEnd - rayStart; 12072 Vector3 dir = rayEnd - rayStart;
12521 12073
12522 float dist = Vector3.Mag(dir); 12074 float dist = Vector3.Mag(dir);
@@ -13090,6 +12642,455 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13090 } 12642 }
13091 } 12643 }
13092 } 12644 }
12645
12646 protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed)
12647 {
12648 //This is a special version of SetPrimParams to deal with avatars which are sat on the linkset.
12649
12650 int idx = 0;
12651 int idxStart = 0;
12652
12653 bool positionChanged = false;
12654 Vector3 finalPos = Vector3.Zero;
12655
12656 try
12657 {
12658 while (idx < rules.Length)
12659 {
12660 ++rulesParsed;
12661 int code = rules.GetLSLIntegerItem(idx++);
12662
12663 int remain = rules.Length - idx;
12664 idxStart = idx;
12665
12666 switch (code)
12667 {
12668 case (int)ScriptBaseClass.PRIM_POSITION:
12669 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
12670 {
12671 if (remain < 1)
12672 return null;
12673
12674 LSL_Vector v;
12675 v = rules.GetVector3Item(idx++);
12676
12677 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
12678 if (part == null)
12679 break;
12680
12681 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
12682 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
12683 if (part.LinkNum > 1)
12684 {
12685 localRot = GetPartLocalRot(part);
12686 localPos = GetPartLocalPos(part);
12687 }
12688
12689 v -= localPos;
12690 v /= localRot;
12691
12692 LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f);
12693
12694 v = v + 2 * sitOffset;
12695
12696 av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
12697 av.SendAvatarDataToAllAgents();
12698
12699 }
12700 break;
12701
12702 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
12703 case (int)ScriptBaseClass.PRIM_ROTATION:
12704 {
12705 if (remain < 1)
12706 return null;
12707
12708 LSL_Rotation r;
12709 r = rules.GetQuaternionItem(idx++);
12710
12711 SceneObjectPart part = World.GetSceneObjectPart(av.ParentID);
12712 if (part == null)
12713 break;
12714
12715 LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION;
12716 LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR;
12717
12718 if (part.LinkNum > 1)
12719 localRot = GetPartLocalRot(part);
12720
12721 r = r * llGetRootRotation() / localRot;
12722 av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
12723 av.SendAvatarDataToAllAgents();
12724 }
12725 break;
12726
12727 // parse rest doing nothing but number of parameters error check
12728 case (int)ScriptBaseClass.PRIM_SIZE:
12729 case (int)ScriptBaseClass.PRIM_MATERIAL:
12730 case (int)ScriptBaseClass.PRIM_PHANTOM:
12731 case (int)ScriptBaseClass.PRIM_PHYSICS:
12732 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
12733 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
12734 case (int)ScriptBaseClass.PRIM_NAME:
12735 case (int)ScriptBaseClass.PRIM_DESC:
12736 if (remain < 1)
12737 return null;
12738 idx++;
12739 break;
12740
12741 case (int)ScriptBaseClass.PRIM_GLOW:
12742 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
12743 case (int)ScriptBaseClass.PRIM_TEXGEN:
12744 if (remain < 2)
12745 return null;
12746 idx += 2;
12747 break;
12748
12749 case (int)ScriptBaseClass.PRIM_TYPE:
12750 if (remain < 3)
12751 return null;
12752 code = (int)rules.GetLSLIntegerItem(idx++);
12753 remain = rules.Length - idx;
12754 switch (code)
12755 {
12756 case (int)ScriptBaseClass.PRIM_TYPE_BOX:
12757 case (int)ScriptBaseClass.PRIM_TYPE_CYLINDER:
12758 case (int)ScriptBaseClass.PRIM_TYPE_PRISM:
12759 if (remain < 6)
12760 return null;
12761 idx += 6;
12762 break;
12763
12764 case (int)ScriptBaseClass.PRIM_TYPE_SPHERE:
12765 if (remain < 5)
12766 return null;
12767 idx += 5;
12768 break;
12769
12770 case (int)ScriptBaseClass.PRIM_TYPE_TORUS:
12771 case (int)ScriptBaseClass.PRIM_TYPE_TUBE:
12772 case (int)ScriptBaseClass.PRIM_TYPE_RING:
12773 if (remain < 11)
12774 return null;
12775 idx += 11;
12776 break;
12777
12778 case (int)ScriptBaseClass.PRIM_TYPE_SCULPT:
12779 if (remain < 2)
12780 return null;
12781 idx += 2;
12782 break;
12783 }
12784 break;
12785
12786 case (int)ScriptBaseClass.PRIM_COLOR:
12787 case (int)ScriptBaseClass.PRIM_TEXT:
12788 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
12789 case (int)ScriptBaseClass.PRIM_OMEGA:
12790 if (remain < 3)
12791 return null;
12792 idx += 3;
12793 break;
12794
12795 case (int)ScriptBaseClass.PRIM_TEXTURE:
12796 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
12797 case (int)ScriptBaseClass.PRIM_PHYSICS_MATERIAL:
12798 if (remain < 5)
12799 return null;
12800 idx += 5;
12801 break;
12802
12803 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
12804 if (remain < 7)
12805 return null;
12806
12807 idx += 7;
12808 break;
12809
12810 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
12811 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
12812 return null;
12813
12814 return rules.GetSublist(idx, -1);
12815 }
12816 }
12817 }
12818 catch (InvalidCastException e)
12819 {
12820 ShoutError(string.Format(
12821 "{0} error running rule #{1}: arg #{2} ",
12822 originFunc, rulesParsed, idx - idxStart) + e.Message);
12823 }
12824 finally
12825 {
12826 if (positionChanged)
12827 {
12828 av.OffsetPosition = finalPos;
12829// av.SendAvatarDataToAllAgents();
12830 av.SendTerseUpdateToAllClients();
12831 positionChanged = false;
12832 }
12833 }
12834 return null;
12835 }
12836
12837 public LSL_List GetPrimParams(ScenePresence avatar, LSL_List rules, ref LSL_List res)
12838 {
12839 // avatars case
12840 // replies as SL wiki
12841
12842// SceneObjectPart sitPart = avatar.ParentPart; // most likelly it will be needed
12843 SceneObjectPart sitPart = World.GetSceneObjectPart(avatar.ParentID); // maybe better do this expensive search for it in case it's gone??
12844
12845 int idx = 0;
12846 while (idx < rules.Length)
12847 {
12848 int code = (int)rules.GetLSLIntegerItem(idx++);
12849 int remain = rules.Length - idx;
12850
12851 switch (code)
12852 {
12853 case (int)ScriptBaseClass.PRIM_MATERIAL:
12854 res.Add(new LSL_Integer((int)SOPMaterialData.SopMaterial.Flesh));
12855 break;
12856
12857 case (int)ScriptBaseClass.PRIM_PHYSICS:
12858 res.Add(new LSL_Integer(0));
12859 break;
12860
12861 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
12862 res.Add(new LSL_Integer(0));
12863 break;
12864
12865 case (int)ScriptBaseClass.PRIM_PHANTOM:
12866 res.Add(new LSL_Integer(0));
12867 break;
12868
12869 case (int)ScriptBaseClass.PRIM_POSITION:
12870
12871 Vector3 pos = avatar.OffsetPosition;
12872
12873 Vector3 sitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f *2.0f);
12874 pos -= sitOffset;
12875
12876 if( sitPart != null)
12877 pos = sitPart.GetWorldPosition() + pos * sitPart.GetWorldRotation();
12878
12879 res.Add(new LSL_Vector(pos.X,pos.Y,pos.Z));
12880 break;
12881
12882 case (int)ScriptBaseClass.PRIM_SIZE:
12883 // as in llGetAgentSize above
12884 res.Add(new LSL_Vector(0.45f, 0.6f, avatar.Appearance.AvatarHeight));
12885 break;
12886
12887 case (int)ScriptBaseClass.PRIM_ROTATION:
12888 Quaternion rot = avatar.Rotation;
12889 if (sitPart != null)
12890 {
12891 rot = sitPart.GetWorldRotation() * rot; // apply sit part world rotation
12892 }
12893
12894 res.Add(new LSL_Rotation (rot.X, rot.Y, rot.Z, rot.W));
12895 break;
12896
12897 case (int)ScriptBaseClass.PRIM_TYPE:
12898 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TYPE_BOX));
12899 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_HOLE_DEFAULT));
12900 res.Add(new LSL_Vector(0f,1.0f,0f));
12901 res.Add(new LSL_Float(0.0f));
12902 res.Add(new LSL_Vector(0, 0, 0));
12903 res.Add(new LSL_Vector(1.0f,1.0f,0f));
12904 res.Add(new LSL_Vector(0, 0, 0));
12905 break;
12906
12907 case (int)ScriptBaseClass.PRIM_TEXTURE:
12908 if (remain < 1)
12909 return null;
12910
12911 int face = (int)rules.GetLSLIntegerItem(idx++);
12912 if (face == ScriptBaseClass.ALL_SIDES)
12913 {
12914 for (face = 0; face < 21; face++)
12915 {
12916 res.Add(new LSL_String(""));
12917 res.Add(new LSL_Vector(0,0,0));
12918 res.Add(new LSL_Vector(0,0,0));
12919 res.Add(new LSL_Float(0.0));
12920 }
12921 }
12922 else
12923 {
12924 if (face >= 0 && face < 21)
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 break;
12933
12934 case (int)ScriptBaseClass.PRIM_COLOR:
12935 if (remain < 1)
12936 return null;
12937
12938 face = (int)rules.GetLSLIntegerItem(idx++);
12939
12940 if (face == ScriptBaseClass.ALL_SIDES)
12941 {
12942 for (face = 0; face < 21; face++)
12943 {
12944 res.Add(new LSL_Vector(0,0,0));
12945 res.Add(new LSL_Float(0));
12946 }
12947 }
12948 else
12949 {
12950 res.Add(new LSL_Vector(0,0,0));
12951 res.Add(new LSL_Float(0));
12952 }
12953 break;
12954
12955 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
12956 if (remain < 1)
12957 return null;
12958 face = (int)rules.GetLSLIntegerItem(idx++);
12959
12960 if (face == ScriptBaseClass.ALL_SIDES)
12961 {
12962 for (face = 0; face < 21; face++)
12963 {
12964 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
12965 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
12966 }
12967 }
12968 else
12969 {
12970 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_SHINY_NONE));
12971 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_BUMP_NONE));
12972 }
12973 break;
12974
12975 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
12976 if (remain < 1)
12977 return null;
12978 face = (int)rules.GetLSLIntegerItem(idx++);
12979
12980 if (face == ScriptBaseClass.ALL_SIDES)
12981 {
12982 for (face = 0; face < 21; face++)
12983 {
12984 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
12985 }
12986 }
12987 else
12988 {
12989 res.Add(new LSL_Integer(ScriptBaseClass.FALSE));
12990 }
12991 break;
12992
12993 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
12994 res.Add(new LSL_Integer(0));
12995 res.Add(new LSL_Integer(0));// softness
12996 res.Add(new LSL_Float(0.0f)); // gravity
12997 res.Add(new LSL_Float(0.0f)); // friction
12998 res.Add(new LSL_Float(0.0f)); // wind
12999 res.Add(new LSL_Float(0.0f)); // tension
13000 res.Add(new LSL_Vector(0f,0f,0f));
13001 break;
13002
13003 case (int)ScriptBaseClass.PRIM_TEXGEN:
13004 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
13005 if (remain < 1)
13006 return null;
13007 face = (int)rules.GetLSLIntegerItem(idx++);
13008
13009 if (face == ScriptBaseClass.ALL_SIDES)
13010 {
13011 for (face = 0; face < 21; face++)
13012 {
13013 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
13014 }
13015 }
13016 else
13017 {
13018 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
13019 }
13020 break;
13021
13022 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
13023 res.Add(new LSL_Integer(0));
13024 res.Add(new LSL_Vector(0f,0f,0f));
13025 res.Add(new LSL_Float(0f)); // intensity
13026 res.Add(new LSL_Float(0f)); // radius
13027 res.Add(new LSL_Float(0f)); // falloff
13028 break;
13029
13030 case (int)ScriptBaseClass.PRIM_GLOW:
13031 if (remain < 1)
13032 return null;
13033 face = (int)rules.GetLSLIntegerItem(idx++);
13034
13035 if (face == ScriptBaseClass.ALL_SIDES)
13036 {
13037 for (face = 0; face < 21; face++)
13038 {
13039 res.Add(new LSL_Float(0f));
13040 }
13041 }
13042 else
13043 {
13044 res.Add(new LSL_Float(0f));
13045 }
13046 break;
13047
13048 case (int)ScriptBaseClass.PRIM_TEXT:
13049 res.Add(new LSL_String(""));
13050 res.Add(new LSL_Vector(0f,0f,0f));
13051 res.Add(new LSL_Float(1.0f));
13052 break;
13053
13054 case (int)ScriptBaseClass.PRIM_NAME:
13055 res.Add(new LSL_String(avatar.Name));
13056 break;
13057
13058 case (int)ScriptBaseClass.PRIM_DESC:
13059 res.Add(new LSL_String(""));
13060 break;
13061
13062 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
13063 Quaternion lrot = avatar.Rotation;
13064
13065 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
13066 {
13067 lrot = sitPart.RotationOffset * lrot; // apply sit part rotation offset
13068 }
13069 res.Add(new LSL_Rotation(lrot.X, lrot.Y, lrot.Z, lrot.W));
13070 break;
13071
13072 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
13073 Vector3 lpos = avatar.OffsetPosition; // pos relative to sit part
13074 Vector3 lsitOffset = (Zrot(avatar.Rotation)) * (avatar.Appearance.AvatarHeight * 0.02638f * 2.0f);
13075 lpos -= lsitOffset;
13076
13077 if (sitPart != null && sitPart != sitPart.ParentGroup.RootPart)
13078 {
13079 lpos = sitPart.OffsetPosition + (lpos * sitPart.RotationOffset); // make it relative to root prim
13080 }
13081 res.Add(new LSL_Vector(lpos.X,lpos.Y,lpos.Z));
13082 break;
13083
13084 case (int)ScriptBaseClass.PRIM_LINK_TARGET:
13085 if (remain < 3) // setting to 3 on the basis that parsing any usage of PRIM_LINK_TARGET that has nothing following it is pointless.
13086 return null;
13087
13088 return rules.GetSublist(idx, -1);
13089 }
13090 }
13091
13092 return null;
13093 }
13093 } 13094 }
13094 13095
13095 public class NotecardCache 13096 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..6809c09 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -254,7 +254,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
254 254
255 object[] convertedParms = new object[parms.Length]; 255 object[] convertedParms = new object[parms.Length];
256 for (int i = 0; i < parms.Length; i++) 256 for (int i = 0; i < parms.Length; i++)
257 convertedParms[i] = ConvertFromLSL(parms[i],signature[i]); 257 convertedParms[i] = ConvertFromLSL(parms[i],signature[i], fname);
258 258
259 // now call the function, the contract with the function is that it will always return 259 // now call the function, the contract with the function is that it will always return
260 // non-null but don't trust it completely 260 // non-null but don't trust it completely
@@ -294,7 +294,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
294 294
295 /// <summary> 295 /// <summary>
296 /// </summary> 296 /// </summary>
297 protected object ConvertFromLSL(object lslparm, Type type) 297 protected object ConvertFromLSL(object lslparm, Type type, string fname)
298 { 298 {
299 // ---------- String ---------- 299 // ---------- String ----------
300 if (lslparm is LSL_String) 300 if (lslparm is LSL_String)
@@ -310,7 +310,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
310 // ---------- Integer ---------- 310 // ---------- Integer ----------
311 else if (lslparm is LSL_Integer) 311 else if (lslparm is LSL_Integer)
312 { 312 {
313 if (type == typeof(int)) 313 if (type == typeof(int) || type == typeof(float))
314 return (int)(LSL_Integer)lslparm; 314 return (int)(LSL_Integer)lslparm;
315 } 315 }
316 316
@@ -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,23 +365,23 @@ 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(String.Format("{0}: unknown LSL list element type", fname));
380 } 378 }
381 379
382 return result; 380 return result;
383 } 381 }
384 } 382 }
385 383
386 MODError(String.Format("parameter type mismatch; expecting {0}",type.Name)); 384 MODError(String.Format("{1}: parameter type mismatch; expecting {0}",type.Name, fname));
387 return null; 385 return null;
388 } 386 }
389 387
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 2f02f1f..160e2df 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -141,6 +141,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
141 internal bool m_debuggerSafe = false; 141 internal bool m_debuggerSafe = false;
142 internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); 142 internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >();
143 143
144 protected IUrlModule m_UrlModule = null;
145
144 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 146 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
145 { 147 {
146 m_ScriptEngine = ScriptEngine; 148 m_ScriptEngine = ScriptEngine;
@@ -148,6 +150,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
148 m_item = item; 150 m_item = item;
149 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 151 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
150 152
153 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
154
151 if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) 155 if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false))
152 m_OSFunctionsEnabled = true; 156 m_OSFunctionsEnabled = true;
153 157
@@ -782,10 +786,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
782 786
783 // We will launch the teleport on a new thread so that when the script threads are terminated 787 // 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. 788 // before teleport in ScriptInstance.GetXMLState(), we don't end up aborting the one doing the teleporting.
785 Util.FireAndForget( 789 Util.FireAndForget(o => World.RequestTeleportLocation(
786 o => World.RequestTeleportLocation(presence.ControllingClient, regionName, 790 presence.ControllingClient, regionName, position,
787 new Vector3((float)position.x, (float)position.y, (float)position.z), 791 lookat, (uint)TPFlags.ViaLocation));
788 new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation));
789 792
790 ScriptSleep(5000); 793 ScriptSleep(5000);
791 794
@@ -828,10 +831,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
828 831
829 // We will launch the teleport on a new thread so that when the script threads are terminated 832 // 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. 833 // before teleport in ScriptInstance.GetXMLState(), we don't end up aborting the one doing the teleporting.
831 Util.FireAndForget( 834 Util.FireAndForget(o => World.RequestTeleportLocation(
832 o => World.RequestTeleportLocation(presence.ControllingClient, regionHandle, 835 presence.ControllingClient, regionHandle,
833 new Vector3((float)position.x, (float)position.y, (float)position.z), 836 position, lookat, (uint)TPFlags.ViaLocation));
834 new Vector3((float)lookat.x, (float)lookat.y, (float)lookat.z), (uint)TPFlags.ViaLocation));
835 837
836 ScriptSleep(5000); 838 ScriptSleep(5000);
837 839
@@ -1680,6 +1682,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1680 return; 1682 return;
1681 } 1683 }
1682 1684
1685 MessageObject(objUUID, message);
1686 }
1687
1688 private void MessageObject(UUID objUUID, string message)
1689 {
1683 object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) }; 1690 object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) };
1684 1691
1685 SceneObjectPart sceneOP = World.GetSceneObjectPart(objUUID); 1692 SceneObjectPart sceneOP = World.GetSceneObjectPart(objUUID);
@@ -2259,11 +2266,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2259 CheckThreatLevel(ThreatLevel.High, "osGetLinkPrimitiveParams"); 2266 CheckThreatLevel(ThreatLevel.High, "osGetLinkPrimitiveParams");
2260 m_host.AddScriptLPS(1); 2267 m_host.AddScriptLPS(1);
2261 InitLSL(); 2268 InitLSL();
2269 // One needs to cast m_LSL_Api because we're using functions not
2270 // on the ILSL_Api interface.
2271 LSL_Api LSL_Api = (LSL_Api)m_LSL_Api;
2262 LSL_List retVal = new LSL_List(); 2272 LSL_List retVal = new LSL_List();
2263 List<SceneObjectPart> parts = ((LSL_Api)m_LSL_Api).GetLinkParts(linknumber); 2273 LSL_List remaining = null;
2274 List<SceneObjectPart> parts = LSL_Api.GetLinkParts(linknumber);
2264 foreach (SceneObjectPart part in parts) 2275 foreach (SceneObjectPart part in parts)
2265 { 2276 {
2266 retVal += ((LSL_Api)m_LSL_Api).GetLinkPrimitiveParams(part, rules); 2277 remaining = LSL_Api.GetPrimParams(part, rules, ref retVal);
2278 }
2279
2280 while (remaining != null && remaining.Length > 2)
2281 {
2282 linknumber = remaining.GetLSLIntegerItem(0);
2283 rules = remaining.GetSublist(1, -1);
2284 parts = LSL_Api.GetLinkParts(linknumber);
2285
2286 foreach (SceneObjectPart part in parts)
2287 remaining = LSL_Api.GetPrimParams(part, rules, ref retVal);
2267 } 2288 }
2268 return retVal; 2289 return retVal;
2269 } 2290 }
@@ -2355,7 +2376,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2355 ownerID = m_host.OwnerID; 2376 ownerID = m_host.OwnerID;
2356 UUID x = module.CreateNPC(firstname, 2377 UUID x = module.CreateNPC(firstname,
2357 lastname, 2378 lastname,
2358 new Vector3((float) position.x, (float) position.y, (float) position.z), 2379 position,
2359 ownerID, 2380 ownerID,
2360 senseAsAgent, 2381 senseAsAgent,
2361 World, 2382 World,
@@ -2478,7 +2499,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2478 return new LSL_Vector(0, 0, 0); 2499 return new LSL_Vector(0, 0, 0);
2479 } 2500 }
2480 2501
2481 public void osNpcMoveTo(LSL_Key npc, LSL_Vector position) 2502 public void osNpcMoveTo(LSL_Key npc, LSL_Vector pos)
2482 { 2503 {
2483 CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); 2504 CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo");
2484 m_host.AddScriptLPS(1); 2505 m_host.AddScriptLPS(1);
@@ -2493,7 +2514,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2493 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2514 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2494 return; 2515 return;
2495 2516
2496 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
2497 module.MoveToTarget(npcId, World, pos, false, true, false); 2517 module.MoveToTarget(npcId, World, pos, false, true, false);
2498 } 2518 }
2499 } 2519 }
@@ -2513,11 +2533,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2513 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2533 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2514 return; 2534 return;
2515 2535
2516 Vector3 pos = new Vector3((float)target.x, (float)target.y, (float)target.z);
2517 module.MoveToTarget( 2536 module.MoveToTarget(
2518 new UUID(npc.m_string), 2537 new UUID(npc.m_string),
2519 World, 2538 World,
2520 pos, 2539 target,
2521 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, 2540 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0,
2522 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0, 2541 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0,
2523 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0); 2542 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0);
@@ -2569,7 +2588,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2569 ScenePresence sp = World.GetScenePresence(npcId); 2588 ScenePresence sp = World.GetScenePresence(npcId);
2570 2589
2571 if (sp != null) 2590 if (sp != null)
2572 sp.Rotation = LSL_Api.Rot2Quaternion(rotation); 2591 sp.Rotation = rotation;
2573 } 2592 }
2574 } 2593 }
2575 2594
@@ -2929,7 +2948,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2929 avatar.SpeedModifier = (float)SpeedModifier; 2948 avatar.SpeedModifier = (float)SpeedModifier;
2930 } 2949 }
2931 2950
2932 public void osKickAvatar(string FirstName,string SurName,string alert) 2951 public void osKickAvatar(string FirstName, string SurName, string alert)
2933 { 2952 {
2934 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); 2953 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar");
2935 m_host.AddScriptLPS(1); 2954 m_host.AddScriptLPS(1);
@@ -2943,10 +2962,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2943 sp.ControllingClient.Kick(alert); 2962 sp.ControllingClient.Kick(alert);
2944 2963
2945 // ...and close on our side 2964 // ...and close on our side
2946 sp.Scene.IncomingCloseAgent(sp.UUID); 2965 sp.Scene.IncomingCloseAgent(sp.UUID, false);
2947 } 2966 }
2948 }); 2967 });
2949 } 2968 }
2969
2970 public LSL_Float osGetHealth(string avatar)
2971 {
2972 CheckThreatLevel(ThreatLevel.None, "osGetHealth");
2973 m_host.AddScriptLPS(1);
2974
2975 LSL_Float health = new LSL_Float(-1);
2976 ScenePresence presence = World.GetScenePresence(new UUID(avatar));
2977 if (presence != null) health = presence.Health;
2978 return health;
2979 }
2950 2980
2951 public void osCauseDamage(string avatar, double damage) 2981 public void osCauseDamage(string avatar, double damage)
2952 { 2982 {
@@ -2959,7 +2989,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2959 ScenePresence presence = World.GetScenePresence(avatarId); 2989 ScenePresence presence = World.GetScenePresence(avatarId);
2960 if (presence != null) 2990 if (presence != null)
2961 { 2991 {
2962 LandData land = World.GetLandData((float)pos.X, (float)pos.Y); 2992 LandData land = World.GetLandData(pos);
2963 if ((land.Flags & (uint)ParcelFlags.AllowDamage) == (uint)ParcelFlags.AllowDamage) 2993 if ((land.Flags & (uint)ParcelFlags.AllowDamage) == (uint)ParcelFlags.AllowDamage)
2964 { 2994 {
2965 float health = presence.Health; 2995 float health = presence.Health;
@@ -3006,7 +3036,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3006 m_host.AddScriptLPS(1); 3036 m_host.AddScriptLPS(1);
3007 InitLSL(); 3037 InitLSL();
3008 3038
3009 return m_LSL_Api.GetLinkPrimitiveParamsEx(prim, rules); 3039 return m_LSL_Api.GetPrimitiveParamsEx(prim, rules);
3010 } 3040 }
3011 3041
3012 public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules) 3042 public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules)
@@ -3015,7 +3045,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3015 m_host.AddScriptLPS(1); 3045 m_host.AddScriptLPS(1);
3016 InitLSL(); 3046 InitLSL();
3017 3047
3018 m_LSL_Api.SetPrimitiveParamsEx(prim, rules); 3048 m_LSL_Api.SetPrimitiveParamsEx(prim, rules, "osSetPrimitiveParams");
3019 } 3049 }
3020 3050
3021 /// <summary> 3051 /// <summary>
@@ -3247,6 +3277,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3247 } 3277 }
3248 } 3278 }
3249 3279
3280 #region Attachment commands
3281
3250 public void osForceAttachToAvatar(int attachmentPoint) 3282 public void osForceAttachToAvatar(int attachmentPoint)
3251 { 3283 {
3252 CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar"); 3284 CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar");
@@ -3336,6 +3368,175 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3336 ((LSL_Api)m_LSL_Api).DetachFromAvatar(); 3368 ((LSL_Api)m_LSL_Api).DetachFromAvatar();
3337 } 3369 }
3338 3370
3371 public LSL_List osGetNumberOfAttachments(LSL_Key avatar, LSL_List attachmentPoints)
3372 {
3373 CheckThreatLevel(ThreatLevel.Moderate, "osGetNumberOfAttachments");
3374
3375 m_host.AddScriptLPS(1);
3376
3377 UUID targetUUID;
3378 ScenePresence target;
3379 LSL_List resp = new LSL_List();
3380
3381 if (attachmentPoints.Length >= 1 && UUID.TryParse(avatar.ToString(), out targetUUID) && World.TryGetScenePresence(targetUUID, out target))
3382 {
3383 foreach (object point in attachmentPoints.Data)
3384 {
3385 LSL_Integer ipoint = new LSL_Integer(
3386 (point is LSL_Integer || point is int || point is uint) ?
3387 (int)point :
3388 0
3389 );
3390 resp.Add(ipoint);
3391 if (ipoint == 0)
3392 {
3393 // indicates zero attachments
3394 resp.Add(new LSL_Integer(0));
3395 }
3396 else
3397 {
3398 // gets the number of attachments on the attachment point
3399 resp.Add(new LSL_Integer(target.GetAttachments((uint)ipoint).Count));
3400 }
3401 }
3402 }
3403
3404 return resp;
3405 }
3406
3407 public void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int options)
3408 {
3409 CheckThreatLevel(ThreatLevel.Moderate, "osMessageAttachments");
3410 m_host.AddScriptLPS(1);
3411
3412 UUID targetUUID;
3413 ScenePresence target;
3414
3415 if (attachmentPoints.Length >= 1 && UUID.TryParse(avatar.ToString(), out targetUUID) && World.TryGetScenePresence(targetUUID, out target))
3416 {
3417 List<int> aps = new List<int>();
3418 foreach (object point in attachmentPoints.Data)
3419 {
3420 int ipoint;
3421 if (int.TryParse(point.ToString(), out ipoint))
3422 {
3423 aps.Add(ipoint);
3424 }
3425 }
3426
3427 List<SceneObjectGroup> attachments = new List<SceneObjectGroup>();
3428
3429 bool msgAll = aps.Contains(ScriptBaseClass.OS_ATTACH_MSG_ALL);
3430 bool invertPoints = (options & ScriptBaseClass.OS_ATTACH_MSG_INVERT_POINTS) != 0;
3431
3432 if (msgAll && invertPoints)
3433 {
3434 return;
3435 }
3436 else if (msgAll || invertPoints)
3437 {
3438 attachments = target.GetAttachments();
3439 }
3440 else
3441 {
3442 foreach (int point in aps)
3443 {
3444 if (point > 0)
3445 {
3446 attachments.AddRange(target.GetAttachments((uint)point));
3447 }
3448 }
3449 }
3450
3451 // if we have no attachments at this point, exit now
3452 if (attachments.Count == 0)
3453 {
3454 return;
3455 }
3456
3457 List<SceneObjectGroup> ignoreThese = new List<SceneObjectGroup>();
3458
3459 if (invertPoints)
3460 {
3461 foreach (SceneObjectGroup attachment in attachments)
3462 {
3463 if (aps.Contains((int)attachment.AttachmentPoint))
3464 {
3465 ignoreThese.Add(attachment);
3466 }
3467 }
3468 }
3469
3470 foreach (SceneObjectGroup attachment in ignoreThese)
3471 {
3472 attachments.Remove(attachment);
3473 }
3474 ignoreThese.Clear();
3475
3476 // if inverting removed all attachments to check, exit now
3477 if (attachments.Count < 1)
3478 {
3479 return;
3480 }
3481
3482 if ((options & ScriptBaseClass.OS_ATTACH_MSG_OBJECT_CREATOR) != 0)
3483 {
3484 foreach (SceneObjectGroup attachment in attachments)
3485 {
3486 if (attachment.RootPart.CreatorID != m_host.CreatorID)
3487 {
3488 ignoreThese.Add(attachment);
3489 }
3490 }
3491
3492 foreach (SceneObjectGroup attachment in ignoreThese)
3493 {
3494 attachments.Remove(attachment);
3495 }
3496 ignoreThese.Clear();
3497
3498 // if filtering by same object creator removed all
3499 // attachments to check, exit now
3500 if (attachments.Count == 0)
3501 {
3502 return;
3503 }
3504 }
3505
3506 if ((options & ScriptBaseClass.OS_ATTACH_MSG_SCRIPT_CREATOR) != 0)
3507 {
3508 foreach (SceneObjectGroup attachment in attachments)
3509 {
3510 if (attachment.RootPart.CreatorID != m_item.CreatorID)
3511 {
3512 ignoreThese.Add(attachment);
3513 }
3514 }
3515
3516 foreach (SceneObjectGroup attachment in ignoreThese)
3517 {
3518 attachments.Remove(attachment);
3519 }
3520 ignoreThese.Clear();
3521
3522 // if filtering by object creator must match originating
3523 // script creator removed all attachments to check,
3524 // exit now
3525 if (attachments.Count == 0)
3526 {
3527 return;
3528 }
3529 }
3530
3531 foreach (SceneObjectGroup attachment in attachments)
3532 {
3533 MessageObject(attachment.RootPart.UUID, message);
3534 }
3535 }
3536 }
3537
3538 #endregion
3539
3339 /// <summary> 3540 /// <summary>
3340 /// Checks if thing is a UUID. 3541 /// Checks if thing is a UUID.
3341 /// </summary> 3542 /// </summary>
@@ -3385,5 +3586,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3385 3586
3386 return new LSL_Key(m_host.ParentGroup.FromPartID.ToString()); 3587 return new LSL_Key(m_host.ParentGroup.FromPartID.ToString());
3387 } 3588 }
3589
3590 /// <summary>
3591 /// Sets the response type for an HTTP request/response
3592 /// </summary>
3593 /// <returns></returns>
3594 public void osSetContentType(LSL_Key id, string type)
3595 {
3596 CheckThreatLevel(ThreatLevel.High,"osSetResponseType");
3597 if (m_UrlModule != null)
3598 m_UrlModule.HttpContentType(new UUID(id),type);
3599 }
3388 } 3600 }
3389} 3601}
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..0ea363a 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
@@ -98,7 +157,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
98 void osAvatarPlayAnimation(string avatar, string animation); 157 void osAvatarPlayAnimation(string avatar, string animation);
99 void osAvatarStopAnimation(string avatar, string animation); 158 void osAvatarStopAnimation(string avatar, string animation);
100 159
101 // Attachment commands 160 #region Attachment commands
102 161
103 /// <summary> 162 /// <summary>
104 /// Attach the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH 163 /// Attach the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH
@@ -133,6 +192,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
133 /// <remarks>Nothing happens if the object is not attached.</remarks> 192 /// <remarks>Nothing happens if the object is not attached.</remarks>
134 void osForceDetachFromAvatar(); 193 void osForceDetachFromAvatar();
135 194
195 /// <summary>
196 /// Returns a strided list of the specified attachment points and the number of attachments on those points.
197 /// </summary>
198 /// <param name="avatar">avatar UUID</param>
199 /// <param name="attachmentPoints">list of ATTACH_* constants</param>
200 /// <returns></returns>
201 LSL_List osGetNumberOfAttachments(LSL_Key avatar, LSL_List attachmentPoints);
202
203 /// <summary>
204 /// Sends a specified message to the specified avatar's attachments on
205 /// the specified attachment points.
206 /// </summary>
207 /// <remarks>
208 /// Behaves as osMessageObject(), without the sending script needing to know the attachment keys in advance.
209 /// </remarks>
210 /// <param name="avatar">avatar UUID</param>
211 /// <param name="message">message string</param>
212 /// <param name="attachmentPoints">list of ATTACH_* constants, or -1 for all attachments. If -1 is specified and OS_ATTACH_MSG_INVERT_POINTS is present in flags, no action is taken.</param>
213 /// <param name="flags">flags further constraining the attachments to deliver the message to.</param>
214 void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int flags);
215
216 #endregion
217
136 //texture draw functions 218 //texture draw functions
137 string osMovePen(string drawList, int x, int y); 219 string osMovePen(string drawList, int x, int y);
138 string osDrawLine(string drawList, int startX, int startY, int endX, int endY); 220 string osDrawLine(string drawList, int startX, int startY, int endX, int endY);
@@ -258,6 +340,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
258 int osGetSimulatorMemory(); 340 int osGetSimulatorMemory();
259 void osKickAvatar(string FirstName,string SurName,string alert); 341 void osKickAvatar(string FirstName,string SurName,string alert);
260 void osSetSpeed(string UUID, LSL_Float SpeedModifier); 342 void osSetSpeed(string UUID, LSL_Float SpeedModifier);
343 LSL_Float osGetHealth(string avatar);
261 void osCauseHealing(string avatar, double healing); 344 void osCauseHealing(string avatar, double healing);
262 void osCauseDamage(string avatar, double damage); 345 void osCauseDamage(string avatar, double damage);
263 LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules); 346 LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules);
@@ -305,5 +388,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
305 /// </summary> 388 /// </summary>
306 /// <returns>Rezzing object key or NULL_KEY if rezzed by agent or otherwise unknown.</returns> 389 /// <returns>Rezzing object key or NULL_KEY if rezzed by agent or otherwise unknown.</returns>
307 LSL_Key osGetRezzingObject(); 390 LSL_Key osGetRezzingObject();
391
392 /// <summary>
393 /// Sets the response type for an HTTP request/response
394 /// </summary>
395 /// <returns></returns>
396 void osSetContentType(LSL_Key id, string type);
308 } 397 }
309} 398}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index f989cc6..c788407 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -237,6 +237,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
237 public const int ATTACH_HUD_BOTTOM = 37; 237 public const int ATTACH_HUD_BOTTOM = 37;
238 public const int ATTACH_HUD_BOTTOM_RIGHT = 38; 238 public const int ATTACH_HUD_BOTTOM_RIGHT = 38;
239 239
240 #region osMessageAttachments constants
241
242 /// <summary>
243 /// Instructs osMessageAttachements to send the message to attachments
244 /// on every point.
245 /// </summary>
246 /// <remarks>
247 /// One might expect this to be named OS_ATTACH_ALL, but then one might
248 /// also expect functions designed to attach or detach or get
249 /// attachments to work with it too. Attaching a no-copy item to
250 /// many attachments could be dangerous.
251 /// when combined with OS_ATTACH_MSG_INVERT_POINTS, will prevent the
252 /// message from being sent.
253 /// if combined with OS_ATTACH_MSG_OBJECT_CREATOR or
254 /// OS_ATTACH_MSG_SCRIPT_CREATOR, could result in no message being
255 /// sent- this is expected behaviour.
256 /// </remarks>
257 public const int OS_ATTACH_MSG_ALL = -65535;
258
259 /// <summary>
260 /// Instructs osMessageAttachements to invert how the attachment points
261 /// list should be treated (e.g. go from inclusive operation to
262 /// exclusive operation).
263 /// </summary>
264 /// <remarks>
265 /// This might be used if you want to deliver a message to one set of
266 /// attachments and a different message to everything else. With
267 /// this flag, you only need to build one explicit list for both calls.
268 /// </remarks>
269 public const int OS_ATTACH_MSG_INVERT_POINTS = 1;
270
271 /// <summary>
272 /// Instructs osMessageAttachments to only send the message to
273 /// attachments with a CreatorID that matches the host object CreatorID
274 /// </summary>
275 /// <remarks>
276 /// This would be used if distributed in an object vendor/updater server.
277 /// </remarks>
278 public const int OS_ATTACH_MSG_OBJECT_CREATOR = 2;
279
280 /// <summary>
281 /// Instructs osMessageAttachments to only send the message to
282 /// attachments with a CreatorID that matches the sending script CreatorID
283 /// </summary>
284 /// <remarks>
285 /// This might be used if the script is distributed independently of a
286 /// containing object.
287 /// </remarks>
288 public const int OS_ATTACH_MSG_SCRIPT_CREATOR = 4;
289
290 #endregion
291
240 public const int LAND_LEVEL = 0; 292 public const int LAND_LEVEL = 0;
241 public const int LAND_RAISE = 1; 293 public const int LAND_RAISE = 1;
242 public const int LAND_LOWER = 2; 294 public const int LAND_LOWER = 2;
@@ -329,6 +381,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
329 public const int PRIM_OMEGA = 32; 381 public const int PRIM_OMEGA = 32;
330 public const int PRIM_POS_LOCAL = 33; 382 public const int PRIM_POS_LOCAL = 33;
331 public const int PRIM_LINK_TARGET = 34; 383 public const int PRIM_LINK_TARGET = 34;
384 public const int PRIM_SLICE = 35;
332 public const int PRIM_TEXGEN_DEFAULT = 0; 385 public const int PRIM_TEXGEN_DEFAULT = 0;
333 public const int PRIM_TEXGEN_PLANAR = 1; 386 public const int PRIM_TEXGEN_PLANAR = 1;
334 387
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 94405d2..52ca3da 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -289,7 +289,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
289 m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); 289 m_OSSL_Functions.osAvatarStopAnimation(avatar, animation);
290 } 290 }
291 291
292 // Avatar functions 292 #region Attachment commands
293 293
294 public void osForceAttachToAvatar(int attachmentPoint) 294 public void osForceAttachToAvatar(int attachmentPoint)
295 { 295 {
@@ -311,6 +311,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
311 m_OSSL_Functions.osForceDetachFromAvatar(); 311 m_OSSL_Functions.osForceDetachFromAvatar();
312 } 312 }
313 313
314 public LSL_List osGetNumberOfAttachments(LSL_Key avatar, LSL_List attachmentPoints)
315 {
316 return m_OSSL_Functions.osGetNumberOfAttachments(avatar, attachmentPoints);
317 }
318
319 public void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int flags)
320 {
321 m_OSSL_Functions.osMessageAttachments(avatar, message, attachmentPoints, flags);
322 }
323
324 #endregion
325
314 // Texture Draw functions 326 // Texture Draw functions
315 327
316 public string osMovePen(string drawList, int x, int y) 328 public string osMovePen(string drawList, int x, int y)
@@ -865,7 +877,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
865 { 877 {
866 m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier); 878 m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier);
867 } 879 }
868 880
881 public LSL_Float osGetHealth(string avatar)
882 {
883 return m_OSSL_Functions.osGetHealth(avatar);
884 }
885
869 public void osCauseDamage(string avatar, double damage) 886 public void osCauseDamage(string avatar, double damage)
870 { 887 {
871 m_OSSL_Functions.osCauseDamage(avatar, damage); 888 m_OSSL_Functions.osCauseDamage(avatar, damage);
@@ -950,5 +967,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
950 { 967 {
951 return m_OSSL_Functions.osGetRezzingObject(); 968 return m_OSSL_Functions.osGetRezzingObject();
952 } 969 }
970
971 public void osSetContentType(LSL_Key id, string type)
972 {
973 m_OSSL_Functions.osSetContentType(id,type);
974 }
953 } 975 }
954} 976}
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