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