From 8dc59f5b59eec82f2a53448eca7b9e528e8e99a1 Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Fri, 24 Sep 2010 10:26:53 -0400 Subject: [PATCH] Added delay for llSetPrimitiveParams() and llSetLinkPrimitiveParams() functions per the LSL wiki. Signed-off-by: Melanie This patch also fixes a large amount of trailing whitespace. While this is beneficial, it should really be in a separate patch that fixes whitespace only. Just good practice. --- .../Shared/Api/Implementation/LSL_Api.cs | 204 +++++++++--------- 1 file changed, 104 insertions(+), 100 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index a6ca17125a..8bf9482e03 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -24,7 +24,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - + using System; using System.Collections; using System.Collections.Generic; @@ -252,9 +252,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.LINK_ALL_OTHERS: if (m_host.ParentGroup == null) return new List(); - + ret = new List(m_host.ParentGroup.Parts); - + if (ret.Contains(m_host)) ret.Remove(m_host); return ret; @@ -262,9 +262,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case ScriptBaseClass.LINK_ALL_CHILDREN: if (m_host.ParentGroup == null) return new List(); - + ret = new List(m_host.ParentGroup.Parts); - + if (ret.Contains(m_host.ParentGroup.RootPart)) ret.Remove(m_host.ParentGroup.RootPart); return ret; @@ -1404,7 +1404,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (face == ScriptBaseClass.ALL_SIDES) face = SceneObjectPart.ALL_SIDES; - + m_host.SetFaceColor(new Vector3((float)color.x, (float)color.y, (float)color.z), face); } @@ -2039,7 +2039,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api //KF: Do NOT use this next line if using ODE physics engine. This need a switch based on .ini Phys Engine type // part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition; - + // So, after thinking about this for a bit, the issue with the part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition line // is it isn't compatible with vehicles because it causes the vehicle body to have to be broken down and rebuilt // It's perfectly okay when the object is not an active physical body though. @@ -4009,7 +4009,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case 1: // DATA_ONLINE (0|1) if (pinfo != null && pinfo.RegionID != UUID.Zero) reply = "1"; - else + else reply = "0"; break; case 2: // DATA_NAME (First Last) @@ -4202,7 +4202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return currentAnimationState; } } - + return String.Empty; } @@ -4317,7 +4317,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; // Need provisions for Group Owned here - if (m_host.OwnerID == targetlandObj.LandData.OwnerID || + if (m_host.OwnerID == targetlandObj.LandData.OwnerID || targetlandObj.LandData.IsGroupOwned || m_host.OwnerID == targetID) { pushAllowed = true; @@ -4337,8 +4337,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((targetlandObj.LandData.Flags & (uint)ParcelFlags.RestrictPushObject) == (uint)ParcelFlags.RestrictPushObject) { // Need provisions for Group Owned here - if (m_host.OwnerID == targetlandObj.LandData.OwnerID || - targetlandObj.LandData.IsGroupOwned || + if (m_host.OwnerID == targetlandObj.LandData.OwnerID || + targetlandObj.LandData.IsGroupOwned || m_host.OwnerID == targetID) { pushAllowed = true; @@ -4463,7 +4463,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return sides; } - + /* The new / changed functions were tested with the following LSL script: @@ -5470,7 +5470,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api flags |= ScriptBaseClass.AGENT_SITTING; } - if (agent.Animator.Animations.DefaultAnimation.AnimID + if (agent.Animator.Animations.DefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) { flags |= ScriptBaseClass.AGENT_SITTING; @@ -5837,7 +5837,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); return World.SimulatorFPS; } - + /* particle system rules should be coming into this routine as doubles, that is rule[0] should be an integer from this list and rule[1] should be the arg @@ -5920,7 +5920,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private void SetParticleSystem(SceneObjectPart part, LSL_List rules) { - + if (rules.Length == 0) { part.RemoveParticleSystem(); @@ -6091,7 +6091,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.PhysActor != null) { float ground = (float)llGround(new LSL_Types.Vector3(0, 0, 0)); - float waterLevel = (float)llWater(new LSL_Types.Vector3(0, 0, 0)); + float waterLevel = (float)llWater(new LSL_Types.Vector3(0, 0, 0)); PIDHoverType hoverType = PIDHoverType.Ground; if (water != 0) { @@ -6105,7 +6105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { height += ground; } - + m_host.SetHoverHeight((float)height, hoverType, (float)tau); } } @@ -6487,19 +6487,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (xmlRpcRouter != null) { string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; - - xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, - m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, + + xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, + m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, xmlrpcMod.Port.ToString())); } - object[] resobj = new object[] - { - new LSL_Integer(1), - new LSL_String(channelID.ToString()), - new LSL_String(UUID.Zero.ToString()), - new LSL_String(String.Empty), - new LSL_Integer(0), - new LSL_String(String.Empty) + object[] resobj = new object[] + { + new LSL_Integer(1), + new LSL_String(channelID.ToString()), + new LSL_String(UUID.Zero.ToString()), + new LSL_String(String.Empty), + new LSL_Integer(0), + new LSL_String(String.Empty) }; m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, new DetectParams[0])); @@ -6874,6 +6874,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { m_host.AddScriptLPS(1); SetPrimParams(m_host, rules); + + ScriptSleep(200); } public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) @@ -6884,6 +6886,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api foreach (SceneObjectPart part in parts) SetPrimParams(part, rules); + + ScriptSleep(200); } public void llSetLinkPrimitiveParamsFast(int linknumber, LSL_List rules) @@ -7041,7 +7045,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); part.Shape.PathCurve = (byte)Extrusion.Curve1; - SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, + SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 0); break; @@ -7061,7 +7065,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); part.Shape.PathCurve = (byte)Extrusion.Curve1; - SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, + SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 1); break; @@ -7081,7 +7085,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api radiusoffset = (float)rules.GetLSLFloatItem(idx++); skew = (float)rules.GetLSLFloatItem(idx++); part.Shape.PathCurve = (byte)Extrusion.Curve1; - SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, + SetPrimitiveShapeParams(part, face, v, hollow, twist, holesize, topshear, profilecut, taper_b, revolutions, radiusoffset, skew, 3); break; @@ -7127,7 +7131,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetAlpha(part, alpha, face); break; - + case (int)ScriptBaseClass.PRIM_FLEXIBLE: if (remain < 7) return; @@ -7143,7 +7147,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force); break; - + case (int)ScriptBaseClass.PRIM_POINT_LIGHT: if (remain < 5) return; @@ -7156,7 +7160,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetPointLight(part, light, lightcolor, intensity, radius, falloff); break; - + case (int)ScriptBaseClass.PRIM_GLOW: if (remain < 2) return; @@ -7166,7 +7170,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetGlow(part, face, glow); break; - + case (int)ScriptBaseClass.PRIM_BUMP_SHINY: if (remain < 3) return; @@ -7177,7 +7181,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetShiny(part, face, shiny, bump); break; - + case (int)ScriptBaseClass.PRIM_FULLBRIGHT: if (remain < 2) return; @@ -7185,7 +7189,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api bool st = rules.GetLSLIntegerItem(idx++); SetFullBright(part, face , st); break; - + case (int)ScriptBaseClass.PRIM_MATERIAL: if (remain < 1) return; @@ -7195,7 +7199,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api part.Material = Convert.ToByte(mat); break; - + case (int)ScriptBaseClass.PRIM_PHANTOM: if (remain < 1) return; @@ -7210,7 +7214,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api part.ScriptSetPhantomStatus(phantom); break; - + case (int)ScriptBaseClass.PRIM_PHYSICS: if (remain < 1) return; @@ -7224,7 +7228,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api part.ScriptSetPhysicsStatus(physics); break; - + case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: if (remain < 1) return; @@ -7350,7 +7354,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector llGetRootPosition() { m_host.AddScriptLPS(1); - return new LSL_Vector(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, + return new LSL_Vector(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, m_host.ParentGroup.AbsolutePosition.Z); } @@ -7444,7 +7448,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { LSL_Vector lower; LSL_Vector upper; - if (presence.Animator.Animations.DefaultAnimation.AnimID + if (presence.Animator.Animations.DefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) { // This is for ground sitting avatars @@ -7643,8 +7647,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api res.Add(new LSL_Float((Shape.PathRevolutions * 0.015) + 1.0)); // Slightly inaccurate, because an unsigned // byte is being used to represent the entire // range of floating-point values from 1.0 - // through 4.0 (which is how SL does it). - + // through 4.0 (which is how SL does it). + // float radiusoffset res.Add(new LSL_Float(Shape.PathRadiusOffset / 100.0)); @@ -7819,104 +7823,104 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Assuming silently fail means give back an empty list. Ideally, need to check this. if (face < 0 || face > m_host.GetNumberOfSides() - 1) return new LSL_List(); - + return GetPrimMediaParams(face, rules); } - + private LSL_List GetPrimMediaParams(int face, LSL_List rules) { IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) throw new Exception("Media on a prim functions not available"); - + MediaEntry me = module.GetMediaEntry(m_host, face); - + // As per http://wiki.secondlife.com/wiki/LlGetPrimMediaParams if (null == me) return new LSL_List(); - + LSL_List res = new LSL_List(); for (int i = 0; i < rules.Length; i++) { int code = (int)rules.GetLSLIntegerItem(i); - + switch (code) { case ScriptBaseClass.PRIM_MEDIA_ALT_IMAGE_ENABLE: // Not implemented res.Add(new LSL_Integer(0)); break; - + case ScriptBaseClass.PRIM_MEDIA_CONTROLS: if (me.Controls == MediaControls.Standard) res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MEDIA_CONTROLS_STANDARD)); else res.Add(new LSL_Integer(ScriptBaseClass.PRIM_MEDIA_CONTROLS_MINI)); break; - + case ScriptBaseClass.PRIM_MEDIA_CURRENT_URL: res.Add(new LSL_String(me.CurrentURL)); break; - + case ScriptBaseClass.PRIM_MEDIA_HOME_URL: res.Add(new LSL_String(me.HomeURL)); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_LOOP: res.Add(me.AutoLoop ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_PLAY: res.Add(me.AutoPlay ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_SCALE: res.Add(me.AutoScale ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_ZOOM: res.Add(me.AutoZoom ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); break; - + case ScriptBaseClass.PRIM_MEDIA_FIRST_CLICK_INTERACT: res.Add(me.InteractOnFirstClick ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); break; - + case ScriptBaseClass.PRIM_MEDIA_WIDTH_PIXELS: res.Add(new LSL_Integer(me.Width)); break; - + case ScriptBaseClass.PRIM_MEDIA_HEIGHT_PIXELS: res.Add(new LSL_Integer(me.Height)); break; - + case ScriptBaseClass.PRIM_MEDIA_WHITELIST_ENABLE: res.Add(me.EnableWhiteList ? ScriptBaseClass.TRUE : ScriptBaseClass.FALSE); break; - + case ScriptBaseClass.PRIM_MEDIA_WHITELIST: string[] urls = (string[])me.WhiteList.Clone(); - + for (int j = 0; j < urls.Length; j++) urls[j] = Uri.EscapeDataString(urls[j]); - + res.Add(new LSL_String(string.Join(", ", urls))); break; - + case ScriptBaseClass.PRIM_MEDIA_PERMS_INTERACT: res.Add(new LSL_Integer((int)me.InteractPermissions)); break; - + case ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL: res.Add(new LSL_Integer((int)me.ControlPermissions)); break; } } - + return res; } - + public LSL_Integer llSetPrimMediaParams(int face, LSL_List rules) { m_host.AddScriptLPS(1); @@ -7927,32 +7931,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Don't perform the media check directly if (face < 0 || face > m_host.GetNumberOfSides() - 1) return ScriptBaseClass.LSL_STATUS_OK; - + return SetPrimMediaParams(face, rules); } - + private LSL_Integer SetPrimMediaParams(int face, LSL_List rules) { IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) throw new Exception("Media on a prim functions not available"); - + MediaEntry me = module.GetMediaEntry(m_host, face); if (null == me) me = new MediaEntry(); - + int i = 0; - + while (i < rules.Length - 1) { int code = rules.GetLSLIntegerItem(i++); - + switch (code) { case ScriptBaseClass.PRIM_MEDIA_ALT_IMAGE_ENABLE: me.EnableAlterntiveImage = (rules.GetLSLIntegerItem(i++) != 0 ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_CONTROLS: int v = rules.GetLSLIntegerItem(i++); if (ScriptBaseClass.PRIM_MEDIA_CONTROLS_STANDARD == v) @@ -7960,47 +7964,47 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api else me.Controls = MediaControls.Mini; break; - + case ScriptBaseClass.PRIM_MEDIA_CURRENT_URL: me.CurrentURL = rules.GetLSLStringItem(i++); break; - + case ScriptBaseClass.PRIM_MEDIA_HOME_URL: me.HomeURL = rules.GetLSLStringItem(i++); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_LOOP: me.AutoLoop = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_PLAY: me.AutoPlay = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_SCALE: me.AutoScale = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_AUTO_ZOOM: me.AutoZoom = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_FIRST_CLICK_INTERACT: me.InteractOnFirstClick = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_WIDTH_PIXELS: me.Width = (int)rules.GetLSLIntegerItem(i++); break; - + case ScriptBaseClass.PRIM_MEDIA_HEIGHT_PIXELS: me.Height = (int)rules.GetLSLIntegerItem(i++); break; - + case ScriptBaseClass.PRIM_MEDIA_WHITELIST_ENABLE: me.EnableWhiteList = (ScriptBaseClass.TRUE == rules.GetLSLIntegerItem(i++) ? true : false); break; - + case ScriptBaseClass.PRIM_MEDIA_WHITELIST: string[] rawWhiteListUrls = rules.GetLSLStringItem(i++).ToString().Split(new char[] { ',' }); List whiteListUrls = new List(); @@ -8008,22 +8012,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api rawWhiteListUrls, delegate(string rawUrl) { whiteListUrls.Add(rawUrl.Trim()); }); me.WhiteList = whiteListUrls.ToArray(); break; - + case ScriptBaseClass.PRIM_MEDIA_PERMS_INTERACT: me.InteractPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); break; - + case ScriptBaseClass.PRIM_MEDIA_PERMS_CONTROL: me.ControlPermissions = (MediaPermission)(byte)(int)rules.GetLSLIntegerItem(i++); break; } } - + module.SetMediaEntry(m_host, face, me); - + return ScriptBaseClass.LSL_STATUS_OK; } - + public LSL_Integer llClearPrimMedia(LSL_Integer face) { m_host.AddScriptLPS(1); @@ -8034,16 +8038,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // FIXME: Don't perform the media check directly if (face < 0 || face > m_host.GetNumberOfSides() - 1) return ScriptBaseClass.LSL_STATUS_OK; - + IMoapModule module = m_ScriptEngine.World.RequestModuleInterface(); if (null == module) throw new Exception("Media on a prim functions not available"); - + module.ClearMediaEntry(m_host, face); - + return ScriptBaseClass.LSL_STATUS_OK; } - + // // // The .NET definition of base 64 is: @@ -8303,7 +8307,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llGetHTTPHeader(LSL_Key request_id, string header) { m_host.AddScriptLPS(1); - + if (m_UrlModule != null) return m_UrlModule.GetHttpHeader(new UUID(request_id), header); return String.Empty; @@ -8492,19 +8496,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return tokens; } - + public LSL_List llParseString2List(string src, LSL_List separators, LSL_List spacers) { m_host.AddScriptLPS(1); return this.ParseString(src, separators, spacers, false); } - + public LSL_List llParseStringKeepNulls(string src, LSL_List separators, LSL_List spacers) { m_host.AddScriptLPS(1); return this.ParseString(src, separators, spacers, true); } - + public LSL_Integer llGetObjectPermMask(int mask) { m_host.AddScriptLPS(1);