diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 74 |
1 files changed, 68 insertions, 6 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 7237d1d..8cbebbb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -5375,12 +5375,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5375 | { | 5375 | { |
5376 | return 0; | 5376 | return 0; |
5377 | } | 5377 | } |
5378 | |||
5379 | // Vectors & Rotations always return zero in SL, but | ||
5380 | // keys don't always return zero, it seems to be a bit complex. | ||
5381 | else if (src.Data[index] is LSL_Vector || | ||
5382 | src.Data[index] is LSL_Rotation) | ||
5383 | { | ||
5384 | return 0; | ||
5385 | } | ||
5378 | try | 5386 | try |
5379 | { | 5387 | { |
5388 | |||
5380 | if (src.Data[index] is LSL_Integer) | 5389 | if (src.Data[index] is LSL_Integer) |
5381 | return (LSL_Integer) src.Data[index]; | 5390 | return (LSL_Integer)src.Data[index]; |
5382 | else if (src.Data[index] is LSL_Float) | 5391 | else if (src.Data[index] is LSL_Float) |
5383 | return Convert.ToInt32(((LSL_Float) src.Data[index]).value); | 5392 | return Convert.ToInt32(((LSL_Float)src.Data[index]).value); |
5384 | return new LSL_Integer(src.Data[index].ToString()); | 5393 | return new LSL_Integer(src.Data[index].ToString()); |
5385 | } | 5394 | } |
5386 | catch (FormatException) | 5395 | catch (FormatException) |
@@ -5400,12 +5409,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5400 | { | 5409 | { |
5401 | return 0.0; | 5410 | return 0.0; |
5402 | } | 5411 | } |
5412 | |||
5413 | // Vectors & Rotations always return zero in SL | ||
5414 | else if (src.Data[index] is LSL_Vector || | ||
5415 | src.Data[index] is LSL_Rotation) | ||
5416 | { | ||
5417 | return 0; | ||
5418 | } | ||
5419 | // valid keys seem to get parsed as integers then converted to floats | ||
5420 | else | ||
5421 | { | ||
5422 | UUID uuidt; | ||
5423 | if (src.Data[index] is LSL_Key && UUID.TryParse(src.Data[index].ToString(), out uuidt)) | ||
5424 | { | ||
5425 | return Convert.ToDouble(new LSL_Integer(src.Data[index].ToString()).value); | ||
5426 | } | ||
5427 | } | ||
5403 | try | 5428 | try |
5404 | { | 5429 | { |
5405 | if (src.Data[index] is LSL_Integer) | 5430 | if (src.Data[index] is LSL_Integer) |
5406 | return Convert.ToDouble(((LSL_Integer) src.Data[index]).value); | 5431 | return Convert.ToDouble(((LSL_Integer)src.Data[index]).value); |
5407 | else if (src.Data[index] is LSL_Float) | 5432 | else if (src.Data[index] is LSL_Float) |
5408 | return Convert.ToDouble(((LSL_Float) src.Data[index]).value); | 5433 | return Convert.ToDouble(((LSL_Float)src.Data[index]).value); |
5409 | else if (src.Data[index] is LSL_String) | 5434 | else if (src.Data[index] is LSL_String) |
5410 | { | 5435 | { |
5411 | string str = ((LSL_String) src.Data[index]).m_string; | 5436 | string str = ((LSL_String) src.Data[index]).m_string; |
@@ -5443,17 +5468,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5443 | return src.Data[index].ToString(); | 5468 | return src.Data[index].ToString(); |
5444 | } | 5469 | } |
5445 | 5470 | ||
5446 | public LSL_String llList2Key(LSL_List src, int index) | 5471 | public LSL_Key llList2Key(LSL_List src, int index) |
5447 | { | 5472 | { |
5448 | m_host.AddScriptLPS(1); | 5473 | m_host.AddScriptLPS(1); |
5449 | if (index < 0) | 5474 | if (index < 0) |
5450 | { | 5475 | { |
5451 | index = src.Length + index; | 5476 | index = src.Length + index; |
5452 | } | 5477 | } |
5478 | |||
5453 | if (index >= src.Length || index < 0) | 5479 | if (index >= src.Length || index < 0) |
5454 | { | 5480 | { |
5455 | return ""; | 5481 | return ""; |
5456 | } | 5482 | } |
5483 | |||
5484 | // SL spits out an empty string for types other than key & string | ||
5485 | // At the time of patching, LSL_Key is currently LSL_String, | ||
5486 | // so the OR check may be a little redundant, but it's being done | ||
5487 | // for completion and should LSL_Key ever be implemented | ||
5488 | // as it's own struct | ||
5489 | else if (!(src.Data[index] is LSL_String || | ||
5490 | src.Data[index] is LSL_Key)) | ||
5491 | { | ||
5492 | return ""; | ||
5493 | } | ||
5494 | |||
5457 | return src.Data[index].ToString(); | 5495 | return src.Data[index].ToString(); |
5458 | } | 5496 | } |
5459 | 5497 | ||
@@ -5472,6 +5510,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5472 | { | 5510 | { |
5473 | return (LSL_Vector)src.Data[index]; | 5511 | return (LSL_Vector)src.Data[index]; |
5474 | } | 5512 | } |
5513 | |||
5514 | // SL spits always out ZERO_VECTOR for anything other than | ||
5515 | // strings or vectors. Although keys always return ZERO_VECTOR, | ||
5516 | // it is currently difficult to make the distinction between | ||
5517 | // a string, a key as string and a string that by coincidence | ||
5518 | // is a string, so we're going to leave that up to the | ||
5519 | // LSL_Vector constructor. | ||
5520 | else if (!(src.Data[index] is LSL_String || | ||
5521 | src.Data[index] is LSL_Vector)) | ||
5522 | { | ||
5523 | return new LSL_Vector(0, 0, 0); | ||
5524 | } | ||
5475 | else | 5525 | else |
5476 | { | 5526 | { |
5477 | return new LSL_Vector(src.Data[index].ToString()); | 5527 | return new LSL_Vector(src.Data[index].ToString()); |
@@ -5489,7 +5539,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5489 | { | 5539 | { |
5490 | return new LSL_Rotation(0, 0, 0, 1); | 5540 | return new LSL_Rotation(0, 0, 0, 1); |
5491 | } | 5541 | } |
5492 | if (src.Data[index].GetType() == typeof(LSL_Rotation)) | 5542 | |
5543 | // SL spits always out ZERO_ROTATION for anything other than | ||
5544 | // strings or vectors. Although keys always return ZERO_ROTATION, | ||
5545 | // it is currently difficult to make the distinction between | ||
5546 | // a string, a key as string and a string that by coincidence | ||
5547 | // is a string, so we're going to leave that up to the | ||
5548 | // LSL_Rotation constructor. | ||
5549 | else if (!(src.Data[index] is LSL_String || | ||
5550 | src.Data[index] is LSL_Rotation)) | ||
5551 | { | ||
5552 | return new LSL_Rotation(0, 0, 0, 1); | ||
5553 | } | ||
5554 | else if (src.Data[index].GetType() == typeof(LSL_Rotation)) | ||
5493 | { | 5555 | { |
5494 | return (LSL_Rotation)src.Data[index]; | 5556 | return (LSL_Rotation)src.Data[index]; |
5495 | } | 5557 | } |