aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs590
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandManager.cs42
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IEventReceiver.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs1
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs16
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs1
8 files changed, 376 insertions, 295 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
index de7ca08..72a4322 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
@@ -68,9 +68,9 @@ namespace OpenSim.Region.ScriptEngine.Common
68 internal uint m_localID; 68 internal uint m_localID;
69 internal UUID m_itemID; 69 internal UUID m_itemID;
70 internal bool throwErrorOnNotImplemented = true; 70 internal bool throwErrorOnNotImplemented = true;
71 internal float m_delayFactor = 1.0f; 71 internal float m_ScriptDelayFactor = 1.0f;
72 internal float m_distanceFactor = 1.0f; 72 internal float m_ScriptDistanceFactor = 1.0f;
73 73 internal AsyncCommandManager AsyncCommands = null;
74 74
75 public LSL_BuiltIn_Commands(ScriptEngineBase.ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 75 public LSL_BuiltIn_Commands(ScriptEngineBase.ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID)
76 { 76 {
@@ -79,6 +79,7 @@ namespace OpenSim.Region.ScriptEngine.Common
79 m_localID = localID; 79 m_localID = localID;
80 m_itemID = itemID; 80 m_itemID = itemID;
81 81
82 AsyncCommands = m_ScriptEngine.m_ASYNCLSLCommandManager;
82 //m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); 83 //m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]");
83 84
84 85
@@ -86,8 +87,8 @@ namespace OpenSim.Region.ScriptEngine.Common
86 if (config.Configs["LL-Functions"] == null) 87 if (config.Configs["LL-Functions"] == null)
87 config.AddConfig("LL-Functions"); 88 config.AddConfig("LL-Functions");
88 89
89 m_delayFactor = config.Configs["LL-Functions"].GetFloat("ScriptDelayFactor", 1.0f); 90 m_ScriptDelayFactor = config.Configs["LL-Functions"].GetFloat("ScriptDelayFactor", 1.0f);
90 m_distanceFactor = config.Configs["LL-Functions"].GetFloat("ScriptDistanceLimitFactor", 1.0f); 91 m_ScriptDistanceFactor = config.Configs["LL-Functions"].GetFloat("ScriptDistanceLimitFactor", 1.0f);
91 92
92 } 93 }
93 94
@@ -97,7 +98,7 @@ namespace OpenSim.Region.ScriptEngine.Common
97 98
98 protected void ScriptSleep(int delay) 99 protected void ScriptSleep(int delay)
99 { 100 {
100 delay = (int)((float)delay * m_delayFactor); 101 delay = (int)((float)delay * m_ScriptDelayFactor);
101 if (delay == 0) 102 if (delay == 0)
102 return; 103 return;
103 System.Threading.Thread.Sleep(delay); 104 System.Threading.Thread.Sleep(delay);
@@ -281,7 +282,6 @@ namespace OpenSim.Region.ScriptEngine.Common
281 } 282 }
282 283
283 //These are the implementations of the various ll-functions used by the LSL scripts. 284 //These are the implementations of the various ll-functions used by the LSL scripts.
284 //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07
285 public LSL_Float llSin(double f) 285 public LSL_Float llSin(double f)
286 { 286 {
287 m_host.AddScriptLPS(1); 287 m_host.AddScriptLPS(1);
@@ -710,7 +710,7 @@ namespace OpenSim.Region.ScriptEngine.Common
710 UUID keyID = UUID.Zero; 710 UUID keyID = UUID.Zero;
711 UUID.TryParse(id, out keyID); 711 UUID.TryParse(id, out keyID);
712 712
713 m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 713 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host);
714 } 714 }
715 715
716 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 716 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -719,13 +719,13 @@ namespace OpenSim.Region.ScriptEngine.Common
719 UUID keyID = UUID.Zero; 719 UUID keyID = UUID.Zero;
720 UUID.TryParse(id, out keyID); 720 UUID.TryParse(id, out keyID);
721 721
722 m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 722 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host);
723 } 723 }
724 724
725 public void llSensorRemove() 725 public void llSensorRemove()
726 { 726 {
727 m_host.AddScriptLPS(1); 727 m_host.AddScriptLPS(1);
728 m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.UnSetSenseRepeaterEvents(m_localID, m_itemID); 728 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID);
729 } 729 }
730 730
731 public string resolveName(UUID objecUUID) 731 public string resolveName(UUID objecUUID)
@@ -759,7 +759,7 @@ namespace OpenSim.Region.ScriptEngine.Common
759 public LSL_String llDetectedName(int number) 759 public LSL_String llDetectedName(int number)
760 { 760 {
761 m_host.AddScriptLPS(1); 761 m_host.AddScriptLPS(1);
762 LSL_List SenseList = m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.GetSensorList(m_localID, m_itemID); 762 LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID);
763 if (SenseList != null) 763 if (SenseList != null)
764 { 764 {
765 if ((number >= 0) && (number < SenseList.Length)) 765 if ((number >= 0) && (number < SenseList.Length))
@@ -799,7 +799,7 @@ namespace OpenSim.Region.ScriptEngine.Common
799 799
800 public UUID uuidDetectedKey(int number) 800 public UUID uuidDetectedKey(int number)
801 { 801 {
802 LSL_List SenseList = m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.GetSensorList(m_localID, m_itemID); 802 LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID);
803 if (SenseList != null) 803 if (SenseList != null)
804 { 804 {
805 if ((number >= 0) && (number < SenseList.Length)) 805 if ((number >= 0) && (number < SenseList.Length))
@@ -836,7 +836,7 @@ namespace OpenSim.Region.ScriptEngine.Common
836 836
837 public EntityBase entityDetectedKey(int number) 837 public EntityBase entityDetectedKey(int number)
838 { 838 {
839 LSL_List SenseList = m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.GetSensorList(m_localID, m_itemID); 839 LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID);
840 if (SenseList != null) 840 if (SenseList != null)
841 { 841 {
842 if ((number >= 0) && (number < SenseList.Length)) 842 if ((number >= 0) && (number < SenseList.Length))
@@ -1809,9 +1809,9 @@ namespace OpenSim.Region.ScriptEngine.Common
1809 { 1809 {
1810 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 1810 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
1811 LSL_Vector currentPos = llGetLocalPos(); 1811 LSL_Vector currentPos = llGetLocalPos();
1812 if (llVecDist(currentPos, targetPos) > 10.0f * m_distanceFactor) 1812 if (llVecDist(currentPos, targetPos) > 10.0f * m_ScriptDistanceFactor)
1813 { 1813 {
1814 targetPos = currentPos + m_distanceFactor * 10.0f * llVecNorm(targetPos - currentPos); 1814 targetPos = currentPos + m_ScriptDistanceFactor * 10.0f * llVecNorm(targetPos - currentPos);
1815 } 1815 }
1816 1816
1817 if (part.ParentID != 0) 1817 if (part.ParentID != 0)
@@ -2440,17 +2440,13 @@ namespace OpenSim.Region.ScriptEngine.Common
2440 public void llRezAtRoot(string inventory, LSL_Vector pos, LSL_Vector vel, LSL_Rotation rot, int param) 2440 public void llRezAtRoot(string inventory, LSL_Vector pos, LSL_Vector vel, LSL_Rotation rot, int param)
2441 { 2441 {
2442 m_host.AddScriptLPS(1); 2442 m_host.AddScriptLPS(1);
2443
2443 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) 2444 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s))
2444 return; 2445 return;
2445 bool found = false;
2446
2447 float dist = (float)llVecDist(llGetPos(), pos); 2446 float dist = (float)llVecDist(llGetPos(), pos);
2448 if (dist > m_distanceFactor * 10.0f)
2449 return;
2450 2447
2451 // Instead of using return;, I'm using continue; because in our TaskInventory implementation 2448 if (dist > m_ScriptDistanceFactor * 10.0f)
2452 // it's possible to have two items with the same task inventory name. 2449 return;
2453 // this is an easter egg of sorts.
2454 2450
2455 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 2451 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
2456 { 2452 {
@@ -2460,7 +2456,7 @@ namespace OpenSim.Region.ScriptEngine.Common
2460 if (inv.Value.InvType != (int)InventoryType.Object) 2456 if (inv.Value.InvType != (int)InventoryType.Object)
2461 { 2457 {
2462 llSay(0, "Unable to create requested object. Object is missing from database."); 2458 llSay(0, "Unable to create requested object. Object is missing from database.");
2463 continue; 2459 return;
2464 } 2460 }
2465 2461
2466 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); 2462 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
@@ -2525,7 +2521,7 @@ namespace OpenSim.Region.ScriptEngine.Common
2525 { 2521 {
2526 m_host.AddScriptLPS(1); 2522 m_host.AddScriptLPS(1);
2527 // Setting timer repeat 2523 // Setting timer repeat
2528 m_ScriptEngine.m_ASYNCLSLCommandManager.m_Timer.SetTimerEvent(m_localID, m_itemID, sec); 2524 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec);
2529 } 2525 }
2530 2526
2531 public void llSleep(double sec) 2527 public void llSleep(double sec)
@@ -2686,7 +2682,26 @@ namespace OpenSim.Region.ScriptEngine.Common
2686 public void llGetNextEmail(string address, string subject) 2682 public void llGetNextEmail(string address, string subject)
2687 { 2683 {
2688 m_host.AddScriptLPS(1); 2684 m_host.AddScriptLPS(1);
2689 NotImplemented("llGetNextEmail"); 2685 IEmailModule emailModule = m_ScriptEngine.World.RequestModuleInterface<IEmailModule>();
2686 if (emailModule == null)
2687 return;
2688 Email email;
2689
2690 email = emailModule.GetNextEmail(m_host.UUID, address, subject);
2691
2692 if (email == null)
2693 return;
2694
2695 m_ScriptEngine.PostObjectEvent(m_host.LocalId,
2696 new EventParams("email",
2697 new Object[] {
2698 new LSL_String(email.time),
2699 new LSL_String(email.sender),
2700 new LSL_String(email.subject),
2701 new LSL_String(email.message),
2702 new LSL_Integer(email.numLeft)},
2703 new DetectParams[0]));
2704
2690 } 2705 }
2691 2706
2692 public LSL_String llGetKey() 2707 public LSL_String llGetKey()
@@ -3015,96 +3030,10 @@ namespace OpenSim.Region.ScriptEngine.Common
3015 3030
3016 public void llSetLinkColor(int linknumber, LSL_Vector color, int face) 3031 public void llSetLinkColor(int linknumber, LSL_Vector color, int face)
3017 { 3032 {
3018 m_host.AddScriptLPS(1); 3033 List<SceneObjectPart> parts = GetLinkParts(linknumber);
3019 SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); 3034
3020 if (linknumber > -1) 3035 foreach (SceneObjectPart part in parts)
3021 { 3036 SetColor(part, color, face);
3022 Primitive.TextureEntry tex = part.Shape.Textures;
3023 Color4 texcolor;
3024 if (face > -1)
3025 {
3026 texcolor = tex.CreateFace((uint)face).RGBA;
3027 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3028 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3029 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3030 tex.FaceTextures[face].RGBA = texcolor;
3031 part.UpdateTexture(tex);
3032 return;
3033 }
3034 else if (face == -1)
3035 {
3036 texcolor = tex.DefaultTexture.RGBA;
3037 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3038 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3039 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3040 tex.DefaultTexture.RGBA = texcolor;
3041 for (uint i = 0; i < 32; i++)
3042 {
3043 if (tex.FaceTextures[i] != null)
3044 {
3045 texcolor = tex.FaceTextures[i].RGBA;
3046 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3047 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3048 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3049 tex.FaceTextures[i].RGBA = texcolor;
3050 }
3051 }
3052 texcolor = tex.DefaultTexture.RGBA;
3053 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3054 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3055 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3056 tex.DefaultTexture.RGBA = texcolor;
3057 part.UpdateTexture(tex);
3058 return;
3059 }
3060 return;
3061 }
3062 else if (linknumber == -1)
3063 {
3064 int num = m_host.ParentGroup.PrimCount;
3065 for (int w = 0; w < num; w++)
3066 {
3067 linknumber = w;
3068 part = m_host.ParentGroup.GetLinkNumPart(linknumber);
3069 Primitive.TextureEntry tex = part.Shape.Textures;
3070 Color4 texcolor;
3071 if (face > -1)
3072 {
3073 texcolor = tex.CreateFace((uint)face).RGBA;
3074 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3075 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3076 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3077 tex.FaceTextures[face].RGBA = texcolor;
3078 part.UpdateTexture(tex);
3079 }
3080 else if (face == -1)
3081 {
3082 texcolor = tex.DefaultTexture.RGBA;
3083 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3084 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3085 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3086 tex.DefaultTexture.RGBA = texcolor;
3087 for (uint i = 0; i < 32; i++)
3088 {
3089 if (tex.FaceTextures[i] != null)
3090 {
3091 texcolor = tex.FaceTextures[i].RGBA;
3092 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3093 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3094 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3095 tex.FaceTextures[i].RGBA = texcolor;
3096 }
3097 }
3098 texcolor = tex.DefaultTexture.RGBA;
3099 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
3100 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
3101 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
3102 tex.DefaultTexture.RGBA = texcolor;
3103 part.UpdateTexture(tex);
3104 }
3105 }
3106 return;
3107 }
3108 } 3037 }
3109 3038
3110 public void llCreateLink(string target, int parent) 3039 public void llCreateLink(string target, int parent)
@@ -3129,10 +3058,11 @@ namespace OpenSim.Region.ScriptEngine.Common
3129 parentPrim = targetPart.ParentGroup; 3058 parentPrim = targetPart.ParentGroup;
3130 childPrim = m_host.ParentGroup; 3059 childPrim = m_host.ParentGroup;
3131 } 3060 }
3132 byte uf = childPrim.RootPart.UpdateFlag; 3061// byte uf = childPrim.RootPart.UpdateFlag;
3133 childPrim.RootPart.UpdateFlag = 0; 3062 childPrim.RootPart.UpdateFlag = 0;
3134 parentPrim.LinkToGroup(childPrim); 3063 parentPrim.LinkToGroup(childPrim);
3135 childPrim.RootPart.UpdateFlag = uf; 3064// if (uf != (Byte)0)
3065// parent.RootPart.UpdateFlag = uf;
3136 } 3066 }
3137 parentPrim.TriggerScriptChangedEvent(Changed.LINK); 3067 parentPrim.TriggerScriptChangedEvent(Changed.LINK);
3138 parentPrim.RootPart.AddFlag(PrimFlags.CreateSelected); 3068 parentPrim.RootPart.AddFlag(PrimFlags.CreateSelected);
@@ -3423,24 +3353,25 @@ namespace OpenSim.Region.ScriptEngine.Common
3423 3353
3424 switch (data) 3354 switch (data)
3425 { 3355 {
3426 case ScriptBaseClass.DATA_ONLINE: // DATA_ONLINE (0|1) 3356 case 1: // DATA_ONLINE (0|1)
3357 // TODO: implement fetching of this information
3427 if (userProfile.CurrentAgent.AgentOnline) 3358 if (userProfile.CurrentAgent.AgentOnline)
3428 reply = "1"; 3359 reply = "1";
3429 else 3360 else
3430 reply = "0"; 3361 reply = "0";
3431 break; 3362 break;
3432 case ScriptBaseClass.DATA_NAME: // DATA_NAME (First Last) 3363 case 2: // DATA_NAME (First Last)
3433 reply = userProfile.FirstName + " " + userProfile.SurName; 3364 reply = userProfile.FirstName + " " + userProfile.SurName;
3434 break; 3365 break;
3435 case ScriptBaseClass.DATA_BORN: // DATA_BORN (YYYY-MM-DD) 3366 case 3: // DATA_BORN (YYYY-MM-DD)
3436 DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0); 3367 DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0);
3437 born = born.AddSeconds(userProfile.Created); 3368 born = born.AddSeconds(userProfile.Created);
3438 reply = born.ToString("yyyy-MM-dd"); 3369 reply = born.ToString("yyyy-MM-dd");
3439 break; 3370 break;
3440 case ScriptBaseClass.DATA_RATING: // DATA_RATING (0,0,0,0,0,0) 3371 case 4: // DATA_RATING (0,0,0,0,0,0)
3441 reply = "0,0,0,0,0,0"; 3372 reply = "0,0,0,0,0,0";
3442 break; 3373 break;
3443 case ScriptBaseClass.DATA_PAYINFO: // DATA_PAYINFO (0|1|2|3) 3374 case 8: // DATA_PAYINFO (0|1|2|3)
3444 reply = "0"; 3375 reply = "0";
3445 break; 3376 break;
3446 default: 3377 default:
@@ -3449,11 +3380,12 @@ namespace OpenSim.Region.ScriptEngine.Common
3449 3380
3450 UUID rq = UUID.Random(); 3381 UUID rq = UUID.Random();
3451 3382
3452 UUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager.m_Dataserver.RegisterRequest( 3383 UUID tid = AsyncCommands.
3453 m_localID, m_itemID, rq.ToString()); 3384 DataserverPlugin.RegisterRequest(m_localID,
3385 m_itemID, rq.ToString());
3454 3386
3455 m_ScriptEngine.m_ASYNCLSLCommandManager. 3387 AsyncCommands.
3456 m_Dataserver.DataserverReply(rq.ToString(), reply); 3388 DataserverPlugin.DataserverReply(rq.ToString(), reply);
3457 3389
3458 // ScriptSleep(100); 3390 // ScriptSleep(100);
3459 return tid.ToString(); 3391 return tid.ToString();
@@ -3467,8 +3399,9 @@ namespace OpenSim.Region.ScriptEngine.Common
3467 { 3399 {
3468 if (item.Type == 3 && item.Name == name) 3400 if (item.Type == 3 && item.Name == name)
3469 { 3401 {
3470 UUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager.m_Dataserver.RegisterRequest( 3402 UUID tid = AsyncCommands.
3471 m_localID, m_itemID, item.AssetID.ToString()); 3403 DataserverPlugin.RegisterRequest(m_localID,
3404 m_itemID, item.AssetID.ToString());
3472 3405
3473 Vector3 region = new Vector3( 3406 Vector3 region = new Vector3(
3474 World.RegionInfo.RegionLocX * Constants.RegionSize, 3407 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -3485,8 +3418,8 @@ namespace OpenSim.Region.ScriptEngine.Common
3485 region = lm.Position + new Vector3(rx, ry, 0) - region; 3418 region = lm.Position + new Vector3(rx, ry, 0) - region;
3486 3419
3487 string reply = region.ToString(); 3420 string reply = region.ToString();
3488 m_ScriptEngine.m_ASYNCLSLCommandManager. 3421 AsyncCommands.
3489 m_Dataserver.DataserverReply(i.ToString(), 3422 DataserverPlugin.DataserverReply(i.ToString(),
3490 reply); 3423 reply);
3491 }, false); 3424 }, false);
3492 3425
@@ -3563,7 +3496,7 @@ namespace OpenSim.Region.ScriptEngine.Common
3563 3496
3564 m_host.AddScriptLPS(1); 3497 m_host.AddScriptLPS(1);
3565 3498
3566 uint partLocalID; 3499 // uint partLocalID;
3567 UUID partItemID; 3500 UUID partItemID;
3568 3501
3569 switch ((int)linknum) 3502 switch ((int)linknum)
@@ -3577,7 +3510,7 @@ namespace OpenSim.Region.ScriptEngine.Common
3577 { 3510 {
3578 if (item.Type == 10) 3511 if (item.Type == 10)
3579 { 3512 {
3580 partLocalID = part.LocalId; 3513 // partLocalID = part.LocalId;
3581 partItemID = item.ItemID; 3514 partItemID = item.ItemID;
3582 3515
3583 object[] resobj = new object[] 3516 object[] resobj = new object[]
@@ -4151,7 +4084,7 @@ namespace OpenSim.Region.ScriptEngine.Common
4151 } 4084 }
4152 catch (KeyNotFoundException) 4085 catch (KeyNotFoundException)
4153 { 4086 {
4154 return id; // The Object/Agent is not in the region so just return the key 4087 return id; // The Object/Agent not in the region so just return the key
4155 } 4088 }
4156 } 4089 }
4157 else 4090 else
@@ -4219,26 +4152,6 @@ namespace OpenSim.Region.ScriptEngine.Common
4219 } 4152 }
4220 } 4153 }
4221 4154
4222 public double osList2Double(LSL_List src, int index)
4223 {
4224 m_host.AddScriptLPS(1);
4225 if (index < 0)
4226 {
4227 index = src.Length + index;
4228 }
4229 if (index >= src.Length)
4230 {
4231 return 0.0;
4232 }
4233 if (src.Data[index] is LSL_Integer)
4234 return Convert.ToDouble(((LSL_Integer) src.Data[index]).value);
4235 else if (src.Data[index] is LSL_Float)
4236 return Convert.ToDouble(((LSL_Float) src.Data[index]).value);
4237 else if (src.Data[index] is LSL_String)
4238 return Convert.ToDouble(((LSL_String) src.Data[index]).m_string);
4239 return Convert.ToDouble(src.Data[index]);
4240 }
4241
4242 public LSL_Float llList2Float(LSL_List src, int index) 4155 public LSL_Float llList2Float(LSL_List src, int index)
4243 { 4156 {
4244 m_host.AddScriptLPS(1); 4157 m_host.AddScriptLPS(1);
@@ -4810,10 +4723,10 @@ namespace OpenSim.Region.ScriptEngine.Common
4810 { 4723 {
4811 m_host.AddScriptLPS(1); 4724 m_host.AddScriptLPS(1);
4812 Primitive.TextureAnimation pTexAnim = new Primitive.TextureAnimation(); 4725 Primitive.TextureAnimation pTexAnim = new Primitive.TextureAnimation();
4813 pTexAnim.Flags =(Primitive.TextureAnimMode)mode; 4726 pTexAnim.Flags = (Primitive.TextureAnimMode)mode;
4814 4727
4815 //ALL_SIDES 4728 //ALL_SIDES
4816 if (face == -1) 4729 if (face == ScriptBaseClass.ALL_SIDES)
4817 face = 255; 4730 face = 255;
4818 4731
4819 pTexAnim.Face = (uint)face; 4732 pTexAnim.Face = (uint)face;
@@ -5176,98 +5089,92 @@ namespace OpenSim.Region.ScriptEngine.Common
5176 switch ((int)rules.Data[i]) 5089 switch ((int)rules.Data[i])
5177 { 5090 {
5178 case (int)ScriptBaseClass.PSYS_PART_FLAGS: 5091 case (int)ScriptBaseClass.PSYS_PART_FLAGS:
5179 prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)((uint)Convert.ToInt32(rules.Data[i + 1].ToString())); 5092 prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)(uint)rules.GetLSLIntegerItem(i + 1);
5180 break; 5093 break;
5181 5094
5182 case (int)ScriptBaseClass.PSYS_PART_START_COLOR: 5095 case (int)ScriptBaseClass.PSYS_PART_START_COLOR:
5183 tempv = (LSL_Vector)rules.Data[i + 1]; 5096 tempv = rules.GetVector3Item(i + 1);
5184 prules.PartStartColor.R = (float)tempv.x; 5097 prules.PartStartColor.R = (float)tempv.x;
5185 prules.PartStartColor.G = (float)tempv.y; 5098 prules.PartStartColor.G = (float)tempv.y;
5186 prules.PartStartColor.B = (float)tempv.z; 5099 prules.PartStartColor.B = (float)tempv.z;
5187 break; 5100 break;
5188 5101
5189 case (int)ScriptBaseClass.PSYS_PART_START_ALPHA: 5102 case (int)ScriptBaseClass.PSYS_PART_START_ALPHA:
5190 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5103 tempf = (float)rules.GetLSLFloatItem(i + 1);
5191 prules.PartStartColor.A = (float)tempf; 5104 prules.PartStartColor.A = tempf;
5192 break; 5105 break;
5193 5106
5194 case (int)ScriptBaseClass.PSYS_PART_END_COLOR: 5107 case (int)ScriptBaseClass.PSYS_PART_END_COLOR:
5195 tempv = (LSL_Vector)rules.Data[i + 1]; 5108 tempv = rules.GetVector3Item(i + 1);
5196 //prules.PartEndColor = new Color4(tempv.x,tempv.y,tempv.z,1);
5197
5198 prules.PartEndColor.R = (float)tempv.x; 5109 prules.PartEndColor.R = (float)tempv.x;
5199 prules.PartEndColor.G = (float)tempv.y; 5110 prules.PartEndColor.G = (float)tempv.y;
5200 prules.PartEndColor.B = (float)tempv.z; 5111 prules.PartEndColor.B = (float)tempv.z;
5201 break; 5112 break;
5202 5113
5203 case (int)ScriptBaseClass.PSYS_PART_END_ALPHA: 5114 case (int)ScriptBaseClass.PSYS_PART_END_ALPHA:
5204 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5115 tempf = (float)rules.GetLSLFloatItem(i + 1);
5205 prules.PartEndColor.A = (float)tempf; 5116 prules.PartEndColor.A = tempf;
5206 break; 5117 break;
5207 5118
5208 case (int)ScriptBaseClass.PSYS_PART_START_SCALE: 5119 case (int)ScriptBaseClass.PSYS_PART_START_SCALE:
5209 tempv = (LSL_Vector)rules.Data[i + 1]; 5120 tempv = rules.GetVector3Item(i + 1);
5210 prules.PartStartScaleX = (float)tempv.x; 5121 prules.PartStartScaleX = (float)tempv.x;
5211 prules.PartStartScaleY = (float)tempv.y; 5122 prules.PartStartScaleY = (float)tempv.y;
5212 break; 5123 break;
5213 5124
5214 case (int)ScriptBaseClass.PSYS_PART_END_SCALE: 5125 case (int)ScriptBaseClass.PSYS_PART_END_SCALE:
5215 tempv = (LSL_Vector)rules.Data[i + 1]; 5126 tempv = rules.GetVector3Item(i + 1);
5216 prules.PartEndScaleX = (float)tempv.x; 5127 prules.PartEndScaleX = (float)tempv.x;
5217 prules.PartEndScaleY = (float)tempv.y; 5128 prules.PartEndScaleY = (float)tempv.y;
5218 break; 5129 break;
5219 5130
5220 case (int)ScriptBaseClass.PSYS_PART_MAX_AGE: 5131 case (int)ScriptBaseClass.PSYS_PART_MAX_AGE:
5221 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5132 tempf = (float)rules.GetLSLFloatItem(i + 1);
5222 prules.PartMaxAge = (float)tempf; 5133 prules.PartMaxAge = tempf;
5223 break; 5134 break;
5224 5135
5225 case (int)ScriptBaseClass.PSYS_SRC_ACCEL: 5136 case (int)ScriptBaseClass.PSYS_SRC_ACCEL:
5226 tempv = (LSL_Vector)rules.Data[i + 1]; 5137 tempv = rules.GetVector3Item(i + 1);
5227 prules.PartAcceleration.X = (float)tempv.x; 5138 prules.PartAcceleration.X = (float)tempv.x;
5228 prules.PartAcceleration.Y = (float)tempv.y; 5139 prules.PartAcceleration.Y = (float)tempv.y;
5229 prules.PartAcceleration.Z = (float)tempv.z; 5140 prules.PartAcceleration.Z = (float)tempv.z;
5230 break; 5141 break;
5231 5142
5232 case (int)ScriptBaseClass.PSYS_SRC_PATTERN: 5143 case (int)ScriptBaseClass.PSYS_SRC_PATTERN:
5233 int tmpi = int.Parse(rules.Data[i + 1].ToString()); 5144 int tmpi = (int)rules.GetLSLIntegerItem(i + 1);
5234 prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; 5145 prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi;
5235 break; 5146 break;
5236 5147
5237 // Xantor 20080503
5238 // Wiki: PSYS_SRC_TEXTURE string inventory item name or key of the particle texture
5239 // "" = default texture.
5240 // 20080530 Updated to remove code duplication
5241 case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: 5148 case (int)ScriptBaseClass.PSYS_SRC_TEXTURE:
5242 prules.Texture = KeyOrName(rules.Data[i + 1].ToString()); 5149 prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1));
5243 break; 5150 break;
5244 5151
5245 case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE: 5152 case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE:
5246 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5153 tempf = (float)rules.GetLSLFloatItem(i + 1);
5247 prules.BurstRate = (float)tempf; 5154 prules.BurstRate = (float)tempf;
5248 break; 5155 break;
5249 5156
5250 case (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT: 5157 case (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT:
5251 prules.BurstPartCount = (byte)Convert.ToByte(rules.Data[i + 1].ToString()); 5158 prules.BurstPartCount = (byte)(int)rules.GetLSLIntegerItem(i + 1);
5252 break; 5159 break;
5253 5160
5254 case (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS: 5161 case (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS:
5255 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5162 tempf = (float)rules.GetLSLFloatItem(i + 1);
5256 prules.BurstRadius = (float)tempf; 5163 prules.BurstRadius = (float)tempf;
5257 break; 5164 break;
5258 5165
5259 case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN: 5166 case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN:
5260 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5167 tempf = (float)rules.GetLSLFloatItem(i + 1);
5261 prules.BurstSpeedMin = (float)tempf; 5168 prules.BurstSpeedMin = (float)tempf;
5262 break; 5169 break;
5263 5170
5264 case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX: 5171 case (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX:
5265 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5172 tempf = (float)rules.GetLSLFloatItem(i + 1);
5266 prules.BurstSpeedMax = (float)tempf; 5173 prules.BurstSpeedMax = (float)tempf;
5267 break; 5174 break;
5268 5175
5269 case (int)ScriptBaseClass.PSYS_SRC_MAX_AGE: 5176 case (int)ScriptBaseClass.PSYS_SRC_MAX_AGE:
5270 tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); 5177 tempf = (float)rules.GetLSLFloatItem(i + 1);
5271 prules.MaxAge = (float)tempf; 5178 prules.MaxAge = (float)tempf;
5272 break; 5179 break;
5273 5180
@@ -6009,26 +5916,26 @@ namespace OpenSim.Region.ScriptEngine.Common
6009 5916
6010 public void llSetPrimitiveParams(LSL_List rules) 5917 public void llSetPrimitiveParams(LSL_List rules)
6011 { 5918 {
6012 llSetLinkPrimitiveParams(m_host.LinkNum, rules); 5919 SetPrimParams(m_host, rules);
6013 } 5920 }
6014 5921
6015 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) 5922 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
6016 { 5923 {
6017 m_host.AddScriptLPS(1); 5924 m_host.AddScriptLPS(1);
6018 5925
6019 if (m_host.ParentGroup == null) 5926 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6020 return;
6021 5927
6022 SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); 5928 foreach (SceneObjectPart part in parts)
6023 5929 SetPrimParams(part, rules);
6024 if (part == null) 5930 }
6025 return;
6026 5931
5932 private void SetPrimParams(SceneObjectPart part, LSL_List rules)
5933 {
6027 int idx = 0; 5934 int idx = 0;
6028 5935
6029 while (idx < rules.Length) 5936 while (idx < rules.Length)
6030 { 5937 {
6031 int code = Convert.ToInt32(rules.Data[idx++]); 5938 int code = rules.GetLSLIntegerItem(idx++);
6032 5939
6033 int remain = rules.Length - idx; 5940 int remain = rules.Length - idx;
6034 5941
@@ -6041,7 +5948,7 @@ namespace OpenSim.Region.ScriptEngine.Common
6041 if (remain < 1) 5948 if (remain < 1)
6042 return; 5949 return;
6043 5950
6044 v=new LSL_Vector(rules.Data[idx++].ToString()); 5951 v=rules.GetVector3Item(idx++);
6045 SetPos(part, v); 5952 SetPos(part, v);
6046 5953
6047 break; 5954 break;
@@ -6049,7 +5956,7 @@ namespace OpenSim.Region.ScriptEngine.Common
6049 if (remain < 1) 5956 if (remain < 1)
6050 return; 5957 return;
6051 5958
6052 v=new LSL_Vector(rules.Data[idx++].ToString()); 5959 v=rules.GetVector3Item(idx++);
6053 SetScale(part, v); 5960 SetScale(part, v);
6054 5961
6055 break; 5962 break;
@@ -6057,7 +5964,7 @@ namespace OpenSim.Region.ScriptEngine.Common
6057 if (remain < 1) 5964 if (remain < 1)
6058 return; 5965 return;
6059 5966
6060 LSL_Rotation q = new LSL_Rotation(rules.Data[idx++].ToString()); 5967 LSL_Rotation q = rules.GetQuaternionItem(idx++);
6061 SetRot(part, q); 5968 SetRot(part, q);
6062 5969
6063 break; 5970 break;
@@ -6066,7 +5973,7 @@ namespace OpenSim.Region.ScriptEngine.Common
6066 if (remain < 3) 5973 if (remain < 3)
6067 return; 5974 return;
6068 5975
6069 code = Convert.ToInt32(rules.Data[idx++]); 5976 code = (int)rules.GetLSLIntegerItem(idx++);
6070 5977
6071 remain = rules.Length - idx; 5978 remain = rules.Length - idx;
6072 float hollow; 5979 float hollow;
@@ -7317,10 +7224,10 @@ namespace OpenSim.Region.ScriptEngine.Common
7317 { 7224 {
7318 m_host.AddScriptLPS(1); 7225 m_host.AddScriptLPS(1);
7319 IConfigSource config = new IniConfigSource(Application.iniFilePath); 7226 IConfigSource config = new IniConfigSource(Application.iniFilePath);
7320 if (config.Configs["LL-Functions"] == null) 7227 if (config.Configs["XEngine"] == null)
7321 config.AddConfig("LL-Functions"); 7228 config.AddConfig("XEngine");
7322 7229
7323 if (config.Configs["LL-Functions"].GetBoolean("AllowGodFunctions", false)) 7230 if (config.Configs["XEngine"].GetBoolean("AllowGodFunctions", false))
7324 { 7231 {
7325 if (World.ExternalChecks.ExternalChecksCanRunConsoleCommand(m_host.OwnerID)) 7232 if (World.ExternalChecks.ExternalChecksCanRunConsoleCommand(m_host.OwnerID))
7326 { 7233 {
@@ -7458,11 +7365,11 @@ namespace OpenSim.Region.ScriptEngine.Common
7458 } 7365 }
7459 UUID rq = UUID.Random(); 7366 UUID rq = UUID.Random();
7460 7367
7461 UUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager. 7368 UUID tid = AsyncCommands.
7462 m_Dataserver.RegisterRequest(m_localID, m_itemID, rq.ToString()); 7369 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString());
7463 7370
7464 m_ScriptEngine.m_ASYNCLSLCommandManager. 7371 AsyncCommands.
7465 m_Dataserver.DataserverReply(rq.ToString(), reply); 7372 DataserverPlugin.DataserverReply(rq.ToString(), reply);
7466 7373
7467 // ScriptSleep(1000); 7374 // ScriptSleep(1000);
7468 return tid.ToString(); 7375 return tid.ToString();
@@ -8424,122 +8331,261 @@ namespace OpenSim.Region.ScriptEngine.Common
8424 throw new Exception("LSL Runtime Error: " + msg); 8331 throw new Exception("LSL Runtime Error: " + msg);
8425 } 8332 }
8426 8333
8334 public delegate void AssetRequestCallback(UUID assetID, AssetBase asset);
8335 private void WithNotecard(UUID assetID, AssetRequestCallback cb)
8336 {
8337 World.AssetCache.GetAsset(assetID, delegate(UUID i, AssetBase a) { cb(i, a); }, false);
8338 }
8339
8427 public LSL_String llGetNumberOfNotecardLines(string name) 8340 public LSL_String llGetNumberOfNotecardLines(string name)
8428 { 8341 {
8429 m_host.AddScriptLPS(1); 8342 m_host.AddScriptLPS(1);
8430 8343
8431 String[] notecardLines = GetNotecardLines(name); 8344 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
8432 if (!String.IsNullOrEmpty(notecardLines[0]))
8433 { 8345 {
8434 UUID rq = UUID.Random(); 8346 if (item.Type == 7 && item.Name == name)
8435 8347 {
8436 UUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager.m_Dataserver.RegisterRequest( 8348 UUID tid = AsyncCommands.
8437 m_localID, m_itemID, rq.ToString()); 8349 DataserverPlugin.RegisterRequest(m_localID,
8438 8350 m_itemID, item.AssetID.ToString());
8439 m_ScriptEngine.m_ASYNCLSLCommandManager. 8351 if (NotecardCache.IsCached(item.AssetID))
8440 m_Dataserver.DataserverReply(rq.ToString(), notecardLines.Length.ToString()); 8352 {
8353 AsyncCommands.
8354 DataserverPlugin.DataserverReply(item.AssetID.ToString(),
8355 NotecardCache.GetLines(item.AssetID).ToString());
8356 // ScriptSleep(100);
8441 return tid.ToString(); 8357 return tid.ToString();
8442 } 8358 }
8443 else 8359 WithNotecard(item.AssetID, delegate (UUID id, AssetBase a)
8444 { 8360 {
8445 return UUID.Zero.ToString(); 8361 System.Text.ASCIIEncoding enc =
8362 new System.Text.ASCIIEncoding();
8363 string data = enc.GetString(a.Data);
8364 //Console.WriteLine(data);
8365 NotecardCache.Cache(id, data);
8366 AsyncCommands.
8367 DataserverPlugin.DataserverReply(id.ToString(),
8368 NotecardCache.GetLines(id).ToString());
8369 });
8370 // ScriptSleep(100);
8371 return tid.ToString();
8446 } 8372 }
8373 }
8374 // if we got to here, we didn't find the notecard the script was asking for
8375 // => complain loudly, as specified by the LSL docs
8376 ShoutError("Notecard '" + name + "' could not be found.");
8377
8447 // ScriptSleep(100); 8378 // ScriptSleep(100);
8379 return UUID.Zero.ToString();
8448 } 8380 }
8449 8381
8450 public LSL_String llGetNotecardLine(string name, int line) 8382 public LSL_String llGetNotecardLine(string name, int line)
8451 { 8383 {
8452 m_host.AddScriptLPS(1); 8384 m_host.AddScriptLPS(1);
8453 8385
8454 String[] notecardLines = GetNotecardLines(name); 8386 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
8455
8456 // line index starts at zero
8457 if ((!String.IsNullOrEmpty(notecardLines[0])) &&
8458 (line >= 0))
8459 { 8387 {
8460 if (line < notecardLines.Length) 8388 if (item.Type == 7 && item.Name == name)
8461 { 8389 {
8462 // ScriptSleep(100); 8390 UUID tid = AsyncCommands.
8463 UUID rq = UUID.Random(); 8391 DataserverPlugin.RegisterRequest(m_localID,
8464 8392 m_itemID, item.AssetID.ToString());
8465 UUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager.m_Dataserver.RegisterRequest(
8466 m_localID, m_itemID, rq.ToString());
8467 8393
8468 m_ScriptEngine.m_ASYNCLSLCommandManager. 8394 if (NotecardCache.IsCached(item.AssetID))
8469 m_Dataserver.DataserverReply(rq.ToString(), notecardLines[line]);
8470 return tid.ToString();
8471 }
8472 else
8473 { 8395 {
8396 AsyncCommands.
8397 DataserverPlugin.DataserverReply(item.AssetID.ToString(),
8398 NotecardCache.GetLine(item.AssetID, line));
8474 // ScriptSleep(100); 8399 // ScriptSleep(100);
8475 UUID rq = UUID.Random(); 8400 return tid.ToString();
8401 }
8476 8402
8477 UUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager.m_Dataserver.RegisterRequest( 8403 WithNotecard(item.AssetID, delegate (UUID id, AssetBase a)
8478 m_localID, m_itemID, rq.ToString()); 8404 {
8405 System.Text.ASCIIEncoding enc =
8406 new System.Text.ASCIIEncoding();
8407 string data = enc.GetString(a.Data);
8408 //Console.WriteLine(data);
8409 NotecardCache.Cache(id, data);
8410 AsyncCommands.
8411 DataserverPlugin.DataserverReply(id.ToString(),
8412 NotecardCache.GetLine(id, line));
8413 });
8479 8414
8480 m_ScriptEngine.m_ASYNCLSLCommandManager. 8415 // ScriptSleep(100);
8481 m_Dataserver.DataserverReply(rq.ToString(), ScriptBaseClass.EOF);
8482 return tid.ToString(); 8416 return tid.ToString();
8483 } 8417 }
8484 } 8418 }
8485 else 8419
8486 { 8420 // if we got to here, we didn't find the notecard the script was asking for
8421 // => complain loudly, as specified by the LSL docs
8422 ShoutError("Notecard '" + name + "' could not be found.");
8423
8487 // ScriptSleep(100); 8424 // ScriptSleep(100);
8488 return UUID.Zero.ToString(); 8425 return UUID.Zero.ToString();
8489 } 8426 }
8427
8428 }
8429
8430 public class NotecardCache
8431 {
8432 private class Notecard
8433 {
8434 public string[] text;
8435 public DateTime lastRef;
8490 } 8436 }
8491 8437
8492 private String[] GetNotecardLines(string name) 8438 private static Dictionary<UUID, Notecard> m_Notecards =
8439 new Dictionary<UUID, Notecard>();
8440
8441 public static void Cache(UUID assetID, string text)
8493 { 8442 {
8494 // bool found = false; 8443 CacheCheck();
8495 int notecardIndex = 0;
8496 String[] notecardLines = { "0" };
8497 notecardLines[0] = String.Empty;
8498 8444
8499 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8445 lock (m_Notecards)
8500 { 8446 {
8501 if ((inv.Value.Name == name) && (inv.Value.InvType == (int)InventoryType.Notecard)) 8447 if (m_Notecards.ContainsKey(assetID))
8448 return;
8449
8450 Notecard nc = new Notecard();
8451 nc.lastRef = DateTime.Now;
8452 nc.text = ParseText(text.Replace("\r", "").Split('\n'));
8453 m_Notecards[assetID] = nc;
8454 }
8455 }
8456
8457 private static string[] ParseText(string[] input)
8458 {
8459 int idx = 0;
8460 int level = 0;
8461 List<string> output = new List<string>();
8462 string[] words;
8463
8464 while (idx < input.Length)
8465 {
8466 if (input[idx] == "{")
8502 { 8467 {
8503 // OK, it has the right name and it is a notecard 8468 level++;
8504 // so get the asset that contains the notecard raw data 8469 idx++;
8505 // and convert it into a string 8470 continue;
8506 AssetBase notecardAsset = World.AssetCache.GetAsset(inv.Value.AssetID, false); 8471 }
8507 String dataString = System.Text.Encoding.ASCII.GetString(notecardAsset.Data);
8508 8472
8509 if (!String.IsNullOrEmpty(dataString)) 8473 if (input[idx]== "}")
8510 { 8474 {
8511 // good, we have the notecard data as a string 8475 level--;
8512 // now parse the text lines using the Linden Text delimiters 8476 idx++;
8513 notecardIndex = dataString.IndexOf("}\nText length "); 8477 continue;
8514 if (notecardIndex > 0) 8478 }
8479
8480 switch (level)
8515 { 8481 {
8516 notecardIndex = notecardIndex + 2; //get past delimiter 8482 case 0:
8517 notecardIndex = dataString.IndexOf("\n", notecardIndex); 8483 words = input[idx].Split(' '); // Linden text ver
8518 if (notecardIndex > 0) 8484 // Notecards are created *really* empty. Treat that as "no text" (just like after saving an empty notecard)
8485 if (words.Length < 3)
8486 return new String[0];
8487
8488 int version = int.Parse(words[3]);
8489 if (version != 2)
8490 return new String[0];
8491 break;
8492 case 1:
8493 words = input[idx].Split(' ');
8494 if (words[0] == "LLEmbeddedItems")
8495 break;
8496 if (words[0] == "Text")
8519 { 8497 {
8520 // Finally got to the first line of the notecard 8498 int len = int.Parse(words[2]);
8521 // now find the end of the notecard text delimited by }<LF> 8499 idx++;
8522 // parse the lines, delimited by <LF> 8500
8523 notecardIndex = dataString.IndexOf("\n", notecardIndex); 8501 int count = -1;
8524 notecardIndex++; // get past delimiter 8502
8525 8503 while (count < len)
8526 int notecardLength = dataString.Length - notecardIndex - 3; 8504 {
8527 8505 // int l = input[idx].Length;
8528 // create new string to parse that only consists of the actual lines in the asset 8506 string ln = input[idx];
8529 Char[] notecardCharArray = dataString.ToCharArray(notecardIndex, notecardLength); 8507
8530 String notecardString = new String(notecardCharArray); 8508 int need = len-count-1;
8531 8509 if (ln.Length > need)
8532 // split the lines of the notecard into separate strings 8510 ln = ln.Substring(0, need);
8533 char[] delimChar = { '\n' }; 8511
8534 notecardLines = notecardString.Split(delimChar); 8512 output.Add(ln);
8535 return notecardLines; 8513 count += ln.Length + 1;
8514 idx++;
8536 } 8515 }
8516
8517 return output.ToArray();
8537 } 8518 }
8519 break;
8520 case 2:
8521 words = input[idx].Split(' '); // count
8522 if (words[0] == "count")
8523 {
8524 int c = int.Parse(words[1]);
8525 if (c > 0)
8526 return new String[0];
8527 break;
8538 } 8528 }
8529 break;
8539 } 8530 }
8531 idx++;
8540 } 8532 }
8541 return notecardLines; 8533 return output.ToArray();
8542 } 8534 }
8543 8535
8536 public static bool IsCached(UUID assetID)
8537 {
8538 lock (m_Notecards)
8539 {
8540 return m_Notecards.ContainsKey(assetID);
8541 }
8542 }
8543
8544 public static int GetLines(UUID assetID)
8545 {
8546 if (!IsCached(assetID))
8547 return -1;
8548
8549 lock (m_Notecards)
8550 {
8551 m_Notecards[assetID].lastRef = DateTime.Now;
8552 return m_Notecards[assetID].text.Length;
8553 }
8554 }
8555
8556 public static string GetLine(UUID assetID, int line)
8557 {
8558 if (line < 0)
8559 return "";
8560
8561 string data;
8562
8563 if (!IsCached(assetID))
8564 return "";
8565
8566 lock (m_Notecards)
8567 {
8568 m_Notecards[assetID].lastRef = DateTime.Now;
8569
8570 if (line >= m_Notecards[assetID].text.Length)
8571 return "\n\n\n";
8572
8573 data = m_Notecards[assetID].text[line];
8574 if (data.Length > 255)
8575 data = data.Substring(0, 255);
8576
8577 return data;
8578 }
8579 }
8580
8581 public static void CacheCheck()
8582 {
8583 foreach (UUID key in new List<UUID>(m_Notecards.Keys))
8584 {
8585 Notecard nc = m_Notecards[key];
8586 if (nc.lastRef.AddSeconds(30) < DateTime.Now)
8587 m_Notecards.Remove(key);
8588 }
8589 }
8544 } 8590 }
8545} 8591}
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandManager.cs
index ee86500..5fa6010 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncCommandManager.cs
@@ -45,12 +45,42 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
45 45
46 public ScriptEngine m_ScriptEngine; 46 public ScriptEngine m_ScriptEngine;
47 47
48 public Timer m_Timer; 48 private Timer m_Timer;
49 public HttpRequest m_HttpRequest; 49 private HttpRequest m_HttpRequest;
50 public Listener m_Listener; 50 private Listener m_Listener;
51 public SensorRepeat m_SensorRepeat; 51 private SensorRepeat m_SensorRepeat;
52 public XmlRequest m_XmlRequest; 52 private XmlRequest m_XmlRequest;
53 public Dataserver m_Dataserver; 53 private Dataserver m_Dataserver;
54
55 public Dataserver DataserverPlugin
56 {
57 get { return m_Dataserver; }
58 }
59
60 public Timer TimerPlugin
61 {
62 get { return m_Timer; }
63 }
64
65 public HttpRequest HttpRequestPlugin
66 {
67 get { return m_HttpRequest; }
68 }
69
70 public Listener ListenerPlugin
71 {
72 get { return m_Listener; }
73 }
74
75 public SensorRepeat SensorRepeatPlugin
76 {
77 get { return m_SensorRepeat; }
78 }
79
80 public XmlRequest XmlRequestPlugin
81 {
82 get { return m_XmlRequest; }
83 }
54 84
55 public AsyncCommandManager(ScriptEngine _ScriptEngine) 85 public AsyncCommandManager(ScriptEngine _ScriptEngine)
56 { 86 {
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs
index 01af0af..c972683 100644
--- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs
+++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs
@@ -48,7 +48,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49 49
50 public static List<ScriptEngine> ScriptEngines = new List<ScriptEngine>(); 50 public static List<ScriptEngine> ScriptEngines = new List<ScriptEngine>();
51 public Scene World; 51 private Scene m_Scene;
52 public Scene World
53 {
54 get { return m_Scene; }
55 }
52 public EventManager m_EventManager; // Handles and queues incoming events from OpenSim 56 public EventManager m_EventManager; // Handles and queues incoming events from OpenSim
53 public EventQueueManager m_EventQueueManager; // Executes events, handles script threads 57 public EventQueueManager m_EventQueueManager; // Executes events, handles script threads
54 public ScriptManager m_ScriptManager; // Load, unload and execute scripts 58 public ScriptManager m_ScriptManager; // Load, unload and execute scripts
@@ -94,7 +98,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
94 98
95 public void InitializeEngine(Scene Sceneworld, IConfigSource config, bool HookUpToServer, ScriptManager newScriptManager) 99 public void InitializeEngine(Scene Sceneworld, IConfigSource config, bool HookUpToServer, ScriptManager newScriptManager)
96 { 100 {
97 World = Sceneworld; 101 m_Scene = Sceneworld;
98 ConfigSource = config; 102 ConfigSource = config;
99 m_hookUpToServer = HookUpToServer; 103 m_hookUpToServer = HookUpToServer;
100 104
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IEventReceiver.cs b/OpenSim/Region/ScriptEngine/Interfaces/IEventReceiver.cs
index 0a063b4..d315800 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IEventReceiver.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IEventReceiver.cs
@@ -33,6 +33,7 @@ using OpenMetaverse;
33using Nini.Config; 33using Nini.Config;
34using OpenSim.Region.ScriptEngine.Interfaces; 34using OpenSim.Region.ScriptEngine.Interfaces;
35using Amib.Threading; 35using Amib.Threading;
36using OpenSim.Framework;
36 37
37namespace OpenSim.Region.ScriptEngine.Interfaces 38namespace OpenSim.Region.ScriptEngine.Interfaces
38{ 39{
@@ -42,6 +43,8 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
42 /// </summary> 43 /// </summary>
43 public interface IEventReceiver 44 public interface IEventReceiver
44 { 45 {
46 Scene World { get; }
47
45 /// <summary> 48 /// <summary>
46 /// Post an event to a single script 49 /// Post an event to a single script
47 /// </summary> 50 /// </summary>
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs
index 51d5006..e0e9e82 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs
@@ -42,7 +42,6 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
42 /// </summary> 42 /// </summary>
43 public interface IScriptEngine : IEventReceiver 43 public interface IScriptEngine : IEventReceiver
44 { 44 {
45 Scene World { get; }
46 IConfig Config { get; } 45 IConfig Config { get; }
47 ILog Log { get; } 46 ILog Log { get; }
48 string ScriptEngineName { get; } 47 string ScriptEngineName { get; }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
index fabcc2c..020e64a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
@@ -48,10 +48,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
48 private static int cmdHandlerThreadCycleSleepms; 48 private static int cmdHandlerThreadCycleSleepms;
49 49
50 private static List<IScene> m_Scenes = new List<IScene>(); 50 private static List<IScene> m_Scenes = new List<IScene>();
51 private static List<IScriptEngine> m_ScriptEngines = 51 private static List<IEventReceiver> m_ScriptEngines =
52 new List<IScriptEngine>(); 52 new List<IEventReceiver>();
53 53
54 public IScriptEngine m_ScriptEngine; 54 public IEventReceiver m_ScriptEngine;
55 private IScene m_Scene; 55 private IScene m_Scene;
56 56
57 private static Dictionary<IScene, Dataserver> m_Dataserver = 57 private static Dictionary<IScene, Dataserver> m_Dataserver =
@@ -97,12 +97,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
97 get { return m_XmlRequest[m_Scene]; } 97 get { return m_XmlRequest[m_Scene]; }
98 } 98 }
99 99
100 public IScriptEngine[] ScriptEngines 100 public IEventReceiver[] ScriptEngines
101 { 101 {
102 get { return m_ScriptEngines.ToArray(); } 102 get { return m_ScriptEngines.ToArray(); }
103 } 103 }
104 104
105 public AsyncCommandManager(IScriptEngine _ScriptEngine) 105 public AsyncCommandManager(IEventReceiver _ScriptEngine)
106 { 106 {
107 m_ScriptEngine = _ScriptEngine; 107 m_ScriptEngine = _ScriptEngine;
108 m_Scene = m_ScriptEngine.World; 108 m_Scene = m_ScriptEngine.World;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 552d47c..f40b1a5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1629,7 +1629,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1629 LSL_Vector currentPos = llGetLocalPos(); 1629 LSL_Vector currentPos = llGetLocalPos();
1630 if (llVecDist(currentPos, targetPos) > 10.0f * m_ScriptDistanceFactor) 1630 if (llVecDist(currentPos, targetPos) > 10.0f * m_ScriptDistanceFactor)
1631 { 1631 {
1632 targetPos = currentPos + m_ScriptDistanceFactor * 10 * llVecNorm(targetPos - currentPos); 1632 targetPos = currentPos + m_ScriptDistanceFactor * 10.0f * llVecNorm(targetPos - currentPos);
1633 } 1633 }
1634 1634
1635 if (part.ParentID != 0) 1635 if (part.ParentID != 0)
@@ -2230,28 +2230,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2230 public void llMakeExplosion() 2230 public void llMakeExplosion()
2231 { 2231 {
2232 m_host.AddScriptLPS(1); 2232 m_host.AddScriptLPS(1);
2233 NotImplemented("llMakeExplosion"); 2233 Deprecated("llMakeExplosion");
2234 // ScriptSleep(100); 2234 // ScriptSleep(100);
2235 } 2235 }
2236 2236
2237 public void llMakeFountain() 2237 public void llMakeFountain()
2238 { 2238 {
2239 m_host.AddScriptLPS(1); 2239 m_host.AddScriptLPS(1);
2240 NotImplemented("llMakeFountain"); 2240 Deprecated("llMakeFountain");
2241 // ScriptSleep(100); 2241 // ScriptSleep(100);
2242 } 2242 }
2243 2243
2244 public void llMakeSmoke() 2244 public void llMakeSmoke()
2245 { 2245 {
2246 m_host.AddScriptLPS(1); 2246 m_host.AddScriptLPS(1);
2247 NotImplemented("llMakeSmoke"); 2247 Deprecated("llMakeSmoke");
2248 // ScriptSleep(100); 2248 // ScriptSleep(100);
2249 } 2249 }
2250 2250
2251 public void llMakeFire() 2251 public void llMakeFire()
2252 { 2252 {
2253 m_host.AddScriptLPS(1); 2253 m_host.AddScriptLPS(1);
2254 NotImplemented("llMakeFire"); 2254 Deprecated("llMakeFire");
2255 // ScriptSleep(100); 2255 // ScriptSleep(100);
2256 } 2256 }
2257 2257
@@ -2261,7 +2261,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2261 2261
2262 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) 2262 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s))
2263 return; 2263 return;
2264 float dist = (float)llVecMag(llGetPos() - pos); 2264 float dist = (float)llVecDist(llGetPos(), pos);
2265 2265
2266 if (dist > m_ScriptDistanceFactor * 10.0f) 2266 if (dist > m_ScriptDistanceFactor * 10.0f)
2267 return; 2267 return;
@@ -2563,7 +2563,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2563 public void llSoundPreload() 2563 public void llSoundPreload()
2564 { 2564 {
2565 m_host.AddScriptLPS(1); 2565 m_host.AddScriptLPS(1);
2566 NotImplemented("llSoundPreload"); 2566 Deprecated("llSoundPreload");
2567 } 2567 }
2568 2568
2569 public void llRotLookAt(LSL_Rotation target, double strength, double damping) 2569 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
@@ -5284,7 +5284,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5284 public void llSetRemoteScriptAccessPin(int pin) 5284 public void llSetRemoteScriptAccessPin(int pin)
5285 { 5285 {
5286 m_host.AddScriptLPS(1); 5286 m_host.AddScriptLPS(1);
5287 NotImplemented("llSetRemoteScriptAccessPin"); 5287 m_host.ScriptAccessPin = pin;
5288 } 5288 }
5289 5289
5290 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) 5290 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param)
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 2e5c627..f4cfef0 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -43,7 +43,6 @@ using OpenSim.Region.Environment;
43using OpenSim.Region.Environment.Scenes; 43using OpenSim.Region.Environment.Scenes;
44using OpenSim.Region.Environment.Interfaces; 44using OpenSim.Region.Environment.Interfaces;
45using OpenSim.Region.ScriptEngine.Shared; 45using OpenSim.Region.ScriptEngine.Shared;
46using OpenSim.Region.ScriptEngine.Shared.Api;
47using OpenSim.Region.ScriptEngine.Shared.ScriptBase; 46using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
48using OpenSim.Region.ScriptEngine.Shared.CodeTools; 47using OpenSim.Region.ScriptEngine.Shared.CodeTools;
49using OpenSim.Region.ScriptEngine.Shared.Instance; 48using OpenSim.Region.ScriptEngine.Shared.Instance;