예제 #1
0
        public string llAvatarOnSitTarget(IScriptInstance script)
        {
            if (script.Host is LLPrimitive)
            {
                LLPrimitive prim = (LLPrimitive)script.Host;

                if (prim.SitPosition != Vector3.Zero)
                {
                    ILinkable[] children = ((ILinkable)script.Host).GetChildren();
                    for (int i = 0, len = children.Length; i < len; i++)
                    {
                        if (children[i] is LLAgent)
                        {
                            LLAgent childAgent = (LLAgent)children[i];
                            if (childAgent.RelativePosition == LLUtil.GetSitTarget(prim.SitPosition, childAgent.Scale))
                                return childAgent.ID.ToString();
                        }

                    }
                }
            }
            else
            {
                // TODO: Warning
            }

            return UUID.Zero.ToString();
        }
예제 #2
0
파일: PrimParams.cs 프로젝트: thoys/simian
        private void OffsetTexture(IScriptInstance script, LLPrimitive obj, float u, float v, int side)
        {
            int sides = GetNumberOfSides(obj);
            if (side >= 0 && side < sides)
            {
                // Change one face
                Primitive.TextureEntryFace face = obj.Prim.Textures.CreateFace((uint)side);
                face.OffsetU = u;
                face.OffsetV = v;

                obj.Scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.Textures);
            }
            else if (side == LSLConstants.ALL_SIDES)
            {
                // Change all of the faces
                for (uint i = 0; i < sides; i++)
                {
                    Primitive.TextureEntryFace face = obj.Prim.Textures.GetFace(i);
                    if (face != null)
                    {
                        face.OffsetU = u;
                        face.OffsetV = v;
                    }
                }

                obj.Scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.Textures);
            }
        }
예제 #3
0
 public Vector3 llGetAccel(IScriptInstance script)
 {
     if (script.Host is IPhysical)
         return ((IPhysical)script.Host).Acceleration;
     else
         return Vector3.Zero;
 }
예제 #4
0
파일: Inventory.cs 프로젝트: thoys/simian
        public int llGetInventoryPermMask(IScriptInstance script, string name, int mask)
        {
            LLPrimitive prim = script.Host as LLPrimitive;
            if (prim == null)
                return 0;

            LLInventoryTaskItem found = prim.Inventory.FindItem(item => item.Name == name);
            if (found != null)
            {
                switch (mask)
                {
                    case LSLConstants.MASK_BASE:
                        return (int)found.Permissions.BaseMask;
                    case LSLConstants.MASK_OWNER:
                        return (int)found.Permissions.OwnerMask;
                    case LSLConstants.MASK_GROUP:
                        return (int)found.Permissions.GroupMask;
                    case LSLConstants.MASK_EVERYONE:
                        return (int)found.Permissions.EveryoneMask;
                    case LSLConstants.MASK_NEXT:
                        return (int)found.Permissions.NextOwnerMask;
                }
            }

            return 0;
        }
예제 #5
0
파일: Inventory.cs 프로젝트: thoys/simian
        public int llGetInventoryNumber(IScriptInstance script, int type)
        {
            LLPrimitive prim = script.Host as LLPrimitive;
            if (prim == null)
                return 0;

            AssetType assetType = (AssetType)type;
            return prim.Inventory.FindAllItems(item => assetType == AssetType.Unknown || item.AssetType == assetType).Count;
        }
예제 #6
0
        public int llGetPermissions(IScriptInstance script)
        {
            if (script is LSLScriptInstance)
            {
                LSLScriptInstance lsl = (LSLScriptInstance)script;
                return (int)lsl.Permissions;
            }

            return 0; // TODO: Warning message
        }
예제 #7
0
        public UUID llGetPermissionsKey(IScriptInstance script)
        {
            if (script is LSLScriptInstance)
            {
                LSLScriptInstance lsl = (LSLScriptInstance)script;
                return lsl.PermissionsKey;
            }

            return UUID.Zero; // TODO: Warning message
        }
예제 #8
0
        public string llGetSubString(IScriptInstance script, string src, int start, int end)
        {
            if (start < 0)
                start = src.Length + start;

            if (end < 0)
                end = src.Length + end;

            // Conventional substring
            if (start <= end)
            {
                // Implies both bounds are out-of-range.
                if (end < 0 || start >= src.Length)
                    return String.Empty;

                // If end is positive, then it directly corresponds to the length of the substring needed (plus one of course).
                if (end >= src.Length)
                    end = src.Length - 1;

                if (start < 0)
                    return src.Substring(0, end + 1);

                // Both indices are positive
                return src.Substring(start, (end + 1) - start);
            }

            // Inverted substring (end < start)
            else
            {
                // Implies both indices are below the lower bound.
                // In the inverted case, that means the entire string will be returned unchanged.
                if (start < 0)
                    return src;

                // If both indices are greater than the upper bound the result may seem initially counter intuitive.
                if (end >= src.Length)
                    return src;

                if (end < 0)
                {
                    if (start < src.Length)
                        return src.Substring(start);

                    return String.Empty;
                }
                else
                {
                    if (start < src.Length)
                        return src.Substring(0, end + 1) + src.Substring(start);

                    return src.Substring(0, end + 1);
                }
            }
        }
예제 #9
0
        public string llDumpList2String(IScriptInstance script, lsl_list src, string separator)
        {
            int len = src.Length;

            string[] arr = new string[len];

            for (int i = 0; i < len; i++)
                arr[i] = src.Data[i].ToString();

            return String.Join(separator, arr);
        }
예제 #10
0
파일: Math.cs 프로젝트: thoys/simian
        public Quaternion llAxes2Rot(IScriptInstance script, Vector3 fwd, Vector3 left, Vector3 up)
        {
            float s;
            float tr = fwd.X + left.Y + up.Z + 1.0f;

            if (tr >= 1.0)
            {
                s = 0.5f / (float)Math.Sqrt(tr);
                return new Quaternion(
                    (float)((left.Z - up.Y) * s),
                    (float)((up.X - fwd.Z) * s),
                    (float)((fwd.Y - left.X) * s),
                    (float)(0.25 / s));
            }
            else
            {
                float max = (left.Y > up.Z) ? left.Y : up.Z;

                if (max < fwd.X)
                {
                    s = (float)Math.Sqrt(fwd.X - (left.Y + up.Z) + 1.0f);
                    float x = s * 0.5f;
                    s = 0.5f / s;
                    return new Quaternion(
                        (float)x,
                        (float)((fwd.Y + left.X) * s),
                        (float)((up.X + fwd.Z) * s),
                        (float)((left.Z - up.Y) * s));
                }
                else if (max == left.Y)
                {
                    s = (float)Math.Sqrt(left.Y - (up.Z + fwd.X) + 1.0);
                    float y = s * 0.5f;
                    s = 0.5f / s;
                    return new Quaternion(
                        (float)((fwd.Y + left.X) * s),
                        (float)y,
                        (float)((left.Z + up.Y) * s),
                        (float)((up.X - fwd.Z) * s));
                }
                else
                {
                    s = (float)Math.Sqrt(up.Z - (fwd.X + left.Y) + 1.0);
                    float z = s * 0.5f;
                    s = 0.5f / s;
                    return new Quaternion(
                        (float)((up.X + fwd.Z) * s),
                        (float)((left.Z + up.Y) * s),
                        (float)z,
                        (float)((fwd.Y - left.X) * s));
                }
            }
        }
예제 #11
0
        public Quaternion llAxes2Rot(IScriptInstance script, Vector3 fwd, Vector3 left, Vector3 up)
        {
            double s;
            double tr = fwd.X + left.Y + up.Z + 1.0;

            if (tr >= 1.0)
            {
                s = 0.5 / Math.Sqrt(tr);
                return new lsl_rotation(
                    (left.Z - up.Y) * s,
                    (up.X - fwd.Z) * s,
                    (fwd.Y - left.X) * s,
                    0.25 / s);
            }
            else
            {
                double max = (left.Y > up.Z) ? left.Y : up.Z;

                if (max < fwd.X)
                {
                    s = Math.Sqrt(fwd.X - (left.Y + up.Z) + 1.0);
                    double x = s * 0.5;
                    s = 0.5 / s;
                    return new lsl_rotation(
                        x,
                        (fwd.Y + left.X) * s,
                        (up.X + fwd.Z) * s,
                        (left.Z - up.Y) * s);
                }
                else if (max == left.Y)
                {
                    s = Math.Sqrt(left.Y - (up.Z + fwd.X) + 1.0);
                    double y = s * 0.5;
                    s = 0.5 / s;
                    return new lsl_rotation(
                        (fwd.Y + left.X) * s,
                        y,
                        (left.Z + up.Y) * s,
                        (up.X - fwd.Z) * s);
                }
                else
                {
                    s = Math.Sqrt(up.Z - (fwd.X + left.Y) + 1.0);
                    double z = s * 0.5;
                    s = 0.5 / s;
                    return new lsl_rotation(
                        (up.X + fwd.Z) * s,
                        (left.Z + up.Y) * s,
                        z,
                        (fwd.Y - left.X) * s);
                }
            }
        }
예제 #12
0
파일: Sound.cs 프로젝트: thoys/simian
        public void llPreloadSound(IScriptInstance script, string sound)
        {
            UUID soundID = KeyOrName(script, sound, AssetType.Sound);
            if (soundID == UUID.Zero)
            {
                script.Host.Scene.EntityChat(this, script.Host, 0f, "Cannot find sound " + sound, Int32.MaxValue, EntityChatType.Debug);
                return;
            }

            if (m_sounds != null)
                m_sounds.PreloadSound(script.Host, soundID, DEFAULT_SOUND_RADIUS);

            script.AddSleepMS(1000);
        }
예제 #13
0
파일: Inventory.cs 프로젝트: thoys/simian
        public string llGetInventoryName(IScriptInstance script, int type, int number)
        {
            LLPrimitive prim = script.Host as LLPrimitive;
            if (prim == null)
                return String.Empty;

            AssetType assetType = (AssetType)type;

            IList<LLInventoryTaskItem> items = prim.Inventory.FindAllItems(item => assetType == AssetType.Unknown || item.AssetType == assetType);
            if (items.Count >= number)
                return String.Empty;

            SortedList<string, LLInventoryTaskItem> sortedItems = new SortedList<string, LLInventoryTaskItem>(items.Count);
            for (int i = 0; i < items.Count; i++)
                sortedItems.Add(items[i].Name, items[i]);

            return sortedItems.Values[number].Name;
        }
예제 #14
0
        public void llRequestPermissions(IScriptInstance script, UUID agentID, int perms)
        {
            if (script is LSLScriptInstance)
            {
                LSLScriptInstance lsl = (LSLScriptInstance)script;

                if (agentID != lsl.PermissionsKey)
                    lsl.Permissions = ScriptPermission.None;

                // TODO: Send script permission dialog to the user
                //script.Host.Scene.RequestScriptPermissions(this, script.Host, agentID, perms);

                // HACK: Automatically grant permissions and fire event, since we don't have a permission dialog yet
                lsl.PermissionsKey = agentID;
                lsl.Permissions = (ScriptPermission)perms;
                m_lslScriptEngine.PostObjectEvent(script.Host.ID, "run_time_permissions", new object[] { perms }, new DetectParams[0]);
            }
        }
예제 #15
0
파일: Strings.cs 프로젝트: thoys/simian
        public string llBase64ToString(IScriptInstance script, string str)
        {
            try
            {
                Decoder utf8Decode = UTF8Encoding.UTF8.GetDecoder();

                byte[] data = Convert.FromBase64String(str);
                int charCount = utf8Decode.GetCharCount(data, 0, data.Length);
                char[] chars = new char[charCount];

                utf8Decode.GetChars(data, 0, data.Length, chars, 0);
                return new String(chars);
            }
            catch (Exception e)
            {
                throw new Exception("Error in base64Decode" + e.Message);
            }
        }
예제 #16
0
파일: Strings.cs 프로젝트: thoys/simian
        public string llDeleteSubString(IScriptInstance script, string src, int start, int end)
        {
            if (start < 0)
                start = src.Length + start;

            if (end < 0)
                end = src.Length + end;

            if (start <= end)
            {
                if (end < 0 || start >= src.Length)
                    return src;

                if (start < 0)
                    start = 0;

                if (end >= src.Length)
                    end = src.Length - 1;

                return src.Remove(start, end - start + 1);
            }
            else
            {
                if (start < 0 || end >= src.Length)
                    return String.Empty;

                if (end > 0)
                {
                    if (start < src.Length)
                        return src.Remove(start).Remove(0, end + 1);
                    else
                        return src.Remove(0, end + 1);
                }
                else
                {
                    if (start < src.Length)
                        return src.Remove(start);
                    else
                        return src;
                }
            }
        }
예제 #17
0
파일: Sound.cs 프로젝트: thoys/simian
        public void llLoopSound(IScriptInstance script, string sound, float volume)
        {
            LLPrimitive prim = script.Host as LLPrimitive;
            if (prim == null)
                return;

            if (prim.Prim.Sound != UUID.Zero)
                llStopSound(script);

            UUID soundID = KeyOrName(script, sound, AssetType.Sound);
            if (soundID != UUID.Zero)
            {
                prim.Prim.Sound = soundID;
                prim.Prim.SoundGain = Utils.Clamp(volume, 0f, 1f);
                prim.Prim.SoundFlags = SoundFlags.Loop;
                prim.Prim.SoundRadius = DEFAULT_SOUND_RADIUS;

                prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.Sound);
            }
        }
예제 #18
0
파일: Lists.cs 프로젝트: thoys/simian
        public object[] llCSV2List(IScriptInstance script, string csv)
        {
            List<object> result = new List<object>();
            int parens = 0;
            int start = 0;
            int length = 0;

            for (int i = 0; i < csv.Length; i++)
            {
                switch (csv[i])
                {
                    case '<':
                        parens++;
                        length++;
                        break;
                    case '>':
                        if (parens > 0)
                            parens--;
                        length++;
                        break;
                    case ',':
                        if (parens == 0)
                        {
                            result.Add(csv.Substring(start, length).Trim());
                            start += length + 1;
                            length = 0;
                        }
                        else
                        {
                            length++;
                        }
                        break;
                    default:
                        length++;
                        break;
                }
            }

            result.Add(csv.Substring(start, length).Trim());
            return result.ToArray();
        }
예제 #19
0
        public string llBase64ToString(IScriptInstance script, string str)
        {
            System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
            System.Text.Decoder utf8Decode = encoder.GetDecoder();
            string result = String.Empty;

            try
            {
                byte[] todecode_byte = Convert.FromBase64String(str);
                int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
                char[] decoded_char = new char[charCount];
                utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
                result = new String(decoded_char);
            }
            catch (Exception e)
            {
                throw new Exception("Error in base64Decode" + e.Message);
            }

            return result;
        }
예제 #20
0
        public double llGround(IScriptInstance script, Vector3 offset)
        {
            Vector3 pos = script.Host.ScenePosition + offset;

            // Clamp to valid position
            pos.X = Utils.Clamp(pos.X, 0f, 255f);
            pos.Y = Utils.Clamp(pos.Y, 0f, 255f);

            //Get the slope normal.  This gives us the equation of the plane tangent to the slope.
            Vector3 normal = llGroundNormal(script, offset);

            // Get the height for the integer coordinates from the Heightmap
            float baseheight = (m_terrain != null)
                ? m_terrain.GetHeightmap()[(int)pos.Y * 256 + (int)pos.X]
                : 0f;

            // Calculate the difference between the actual coordinates and the integer coordinates
            double xdiff = pos.X - Math.Floor(pos.X);
            double ydiff = pos.Y - Math.Floor(pos.Y);

            // Use the equation of the tangent plane to adjust the height to account for slope
            return (((normal.X * xdiff) + (normal.Y * ydiff)) / (normal.Z  * -1f)) + baseheight;
        }
예제 #21
0
 public double llVecDist(IScriptInstance script, Vector3 vec_a, Vector3 vec_b)
 {
     return Vector3.Distance(vec_a, vec_b);
 }
예제 #22
0
        public Quaternion llRotBetween(IScriptInstance script, Vector3 start, Vector3 end)
        {
            start = lsl_vector.Norm(start);
            end = lsl_vector.Norm(end);

            double dotProduct = lsl_vector.Dot(start, end);
            lsl_vector crossProduct = lsl_vector.Cross(start, end);
            double magProduct = lsl_vector.Mag(start) * lsl_vector.Mag(end);
            double angle = Math.Acos(dotProduct / magProduct);
            lsl_vector axis = lsl_vector.Norm(crossProduct);
            double s = Math.Sin(angle / 2);

            double x = axis.x * s;
            double y = axis.y * s;
            double z = axis.z * s;
            double w = Math.Cos(angle / 2);

            if (Double.IsNaN(x) || Double.IsNaN(y) || Double.IsNaN(z) || Double.IsNaN(w))
                return Quaternion.Identity;

            return new lsl_rotation(x, y, z, w);
        }
예제 #23
0
 public double llSqrt(IScriptInstance script, double val)
 {
     return Math.Sqrt(val);
 }
예제 #24
0
 public Vector3 llRot2Up(IScriptInstance script, Quaternion q)
 {
     return(llVecNorm(script, Vector3.UnitZ * q));
 }
예제 #25
0
 public float llVecDist(IScriptInstance script, Vector3 vec_a, Vector3 vec_b)
 {
     return(Vector3.Distance(vec_a, vec_b));
 }
예제 #26
0
 public float llVecMag(IScriptInstance script, Vector3 vec)
 {
     return(vec.Length());
 }
예제 #27
0
        private void SetPrimType(IScriptInstance script, object[] rules, ref int i)
        {
            LLPrimitive prim = script.Host as LLPrimitive;

            if (prim == null)
            {
                return;
            }

            int code = llList2Integer(script, rules, i++);

            switch (code)
            {
            case LSLConstants.PRIM_TYPE_BOX:
            {
                int     holeShape = llList2Integer(script, rules, i++);
                Vector3 cut       = llList2Vector(script, rules, i++);
                float   hollow    = llList2Float(script, rules, i++);
                Vector3 twist     = llList2Vector(script, rules, i++);
                Vector3 topSize   = llList2Vector(script, rules, i++);
                Vector3 topShear  = llList2Vector(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Box);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, topSize, topShear);
                break;
            }

            case LSLConstants.PRIM_TYPE_CYLINDER:
            {
                int     holeShape = llList2Integer(script, rules, i++);
                Vector3 cut       = llList2Vector(script, rules, i++);
                float   hollow    = llList2Float(script, rules, i++);
                Vector3 twist     = llList2Vector(script, rules, i++);
                Vector3 topSize   = llList2Vector(script, rules, i++);
                Vector3 topShear  = llList2Vector(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Cylinder);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, topSize, topShear);
                break;
            }

            case LSLConstants.PRIM_TYPE_PRISM:
            {
                int     holeShape = llList2Integer(script, rules, i++);
                Vector3 cut       = llList2Vector(script, rules, i++);
                float   hollow    = llList2Float(script, rules, i++);
                Vector3 twist     = llList2Vector(script, rules, i++);
                Vector3 topSize   = llList2Vector(script, rules, i++);
                Vector3 topShear  = llList2Vector(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Prism);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, topSize, topShear);
                break;
            }

            case LSLConstants.PRIM_TYPE_SPHERE:
            {
                int     holeShape = llList2Integer(script, rules, i++);
                Vector3 cut       = llList2Vector(script, rules, i++);
                float   hollow    = llList2Float(script, rules, i++);
                Vector3 twist     = llList2Vector(script, rules, i++);
                Vector3 dimple    = llList2Vector(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Sphere);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, dimple);
                break;
            }

            case LSLConstants.PRIM_TYPE_TORUS:
            {
                int     holeShape    = llList2Integer(script, rules, i++);
                Vector3 cut          = llList2Vector(script, rules, i++);
                float   hollow       = llList2Float(script, rules, i++);
                Vector3 twist        = llList2Vector(script, rules, i++);
                Vector3 topSize      = llList2Vector(script, rules, i++);
                Vector3 topShear     = llList2Vector(script, rules, i++);
                Vector3 advCut       = llList2Vector(script, rules, i++);
                Vector3 taper        = llList2Vector(script, rules, i++);
                float   revolutions  = llList2Float(script, rules, i++);
                float   radiusOffset = llList2Float(script, rules, i++);
                float   skew         = llList2Float(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Torus);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, topSize, topShear, advCut, taper, revolutions, radiusOffset, skew);
                break;
            }

            case LSLConstants.PRIM_TYPE_TUBE:
            {
                int     holeShape    = llList2Integer(script, rules, i++);
                Vector3 cut          = llList2Vector(script, rules, i++);
                float   hollow       = llList2Float(script, rules, i++);
                Vector3 twist        = llList2Vector(script, rules, i++);
                Vector3 topSize      = llList2Vector(script, rules, i++);
                Vector3 topShear     = llList2Vector(script, rules, i++);
                Vector3 advCut       = llList2Vector(script, rules, i++);
                Vector3 taper        = llList2Vector(script, rules, i++);
                float   revolutions  = llList2Float(script, rules, i++);
                float   radiusOffset = llList2Float(script, rules, i++);
                float   skew         = llList2Float(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Tube);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, topSize, topShear, advCut, taper, revolutions, radiusOffset, skew);
                break;
            }

            case LSLConstants.PRIM_TYPE_RING:
            {
                int     holeShape    = llList2Integer(script, rules, i++);
                Vector3 cut          = llList2Vector(script, rules, i++);
                float   hollow       = llList2Float(script, rules, i++);
                Vector3 twist        = llList2Vector(script, rules, i++);
                Vector3 topSize      = llList2Vector(script, rules, i++);
                Vector3 topShear     = llList2Vector(script, rules, i++);
                Vector3 advCut       = llList2Vector(script, rules, i++);
                Vector3 taper        = llList2Vector(script, rules, i++);
                float   revolutions  = llList2Float(script, rules, i++);
                float   radiusOffset = llList2Float(script, rules, i++);
                float   skew         = llList2Float(script, rules, i++);

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Ring);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = null;

                SetPrimShapeParams(prim, holeShape, cut, hollow, twist, topSize, topShear, advCut, taper, revolutions, radiusOffset, skew);
                break;
            }

            case LSLConstants.PRIM_TYPE_SCULPT:
            {
                string     sculptMap = llList2String(script, rules, i++);
                SculptType type      = (SculptType)llList2Integer(script, rules, i++);
                UUID       textureID = InventoryKey(script, sculptMap, AssetType.Texture);
                if (textureID == UUID.Zero)
                {
                    return;
                }

                Primitive.ConstructionData primData = ObjectManager.BuildBasicShape(PrimType.Sculpt);
                primData.Material = prim.Prim.PrimData.Material;
                primData.State    = prim.Prim.PrimData.State;

                Primitive.SculptData sculpt = new Primitive.SculptData();
                sculpt.Type          = type;
                sculpt.SculptTexture = textureID;

                prim.Prim.PrimData = primData;
                prim.Prim.Sculpt   = sculpt;
                break;
            }
            }
        }
예제 #28
0
 public int llAbs(IScriptInstance script, int val)
 {
     return(Math.Abs(val));
 }
예제 #29
0
 public float llFabs(IScriptInstance script, float val)
 {
     return(Math.Abs(val));
 }
예제 #30
0
 public float llSqrt(IScriptInstance script, float val)
 {
     return((float)Math.Sqrt(val));
 }
예제 #31
0
 public float llPow(IScriptInstance script, float base_, float exponent)
 {
     return((float)Math.Pow(base_, exponent));
 }
예제 #32
0
 public float llAtan2(IScriptInstance script, float y, float x)
 {
     return((float)Math.Atan2(y, x));
 }
예제 #33
0
 public float llTan(IScriptInstance script, float theta)
 {
     return((float)Math.Tan(theta));
 }
예제 #34
0
 public float llCos(IScriptInstance script, float theta)
 {
     return((float)Math.Cos(theta));
 }
예제 #35
0
 public Vector3 llVecNorm(IScriptInstance script, Vector3 vec)
 {
     // NOTE: Emulates behavior reported in https://jira.secondlife.com/browse/SVC-4711
     double mag = vec.Length();
     return (mag != 0.0d) ? vec / (float)mag : Vector3.Zero;
 }
예제 #36
0
파일: Prims.cs 프로젝트: jhurliman/simian
 public void llRezObject(IScriptInstance script, string inventory, Vector3 position, Vector3 vel, Quaternion rot, int param)
 {
     RezObject(script, inventory, position, vel, rot, param, false);
 }
예제 #37
0
 public double llAtan2(IScriptInstance script, double y, double x)
 {
     return Math.Atan2(y, x);
 }
예제 #38
0
파일: Prims.cs 프로젝트: jhurliman/simian
 public void llSetStatus(IScriptInstance script, int flags, int enabledInt)
 {
     SetStatus(script.Host, flags, enabledInt);
 }
예제 #39
0
 public void llSetPrimitiveParams(IScriptInstance script, object[] rules)
 {
     script.AddSleepMS(200);
     SetPrimParams(script, script.Host, rules);
 }
예제 #40
0
파일: Prims.cs 프로젝트: jhurliman/simian
 public void llSetLocalRot(IScriptInstance script, Quaternion rot)
 {
     script.Host.RelativeRotation = rot;
     script.Host.Scene.EntityAddOrUpdate(this, script.Host, UpdateFlags.Rotation, 0);
     script.AddSleepMS(200);
 }
예제 #41
0
 public float llCeil(IScriptInstance script, float val)
 {
     return((float)Math.Ceiling(val));
 }
예제 #42
0
 public Quaternion llEuler2Rot(IScriptInstance script, Vector3 v)
 {
     return(Quaternion.CreateFromEulers(v));
 }
예제 #43
0
파일: Prims.cs 프로젝트: jhurliman/simian
 public void llSetText(IScriptInstance script, string text, Vector3 color, float alpha)
 {
     SetText(script.Host, text, color, alpha);
     script.AddSleepMS(200);
 }
예제 #44
0
파일: World.cs 프로젝트: jhurliman/simian
 public void llOwnerSay(IScriptInstance script, string text)
 {
     Say(script, 0f, text, 0, EntityChatType.Owner);
 }
예제 #45
0
파일: Prims.cs 프로젝트: jhurliman/simian
 public UUID llGetKey(IScriptInstance script)
 {
     return(script.Host.ID);
 }
예제 #46
0
파일: World.cs 프로젝트: jhurliman/simian
 public Vector3 llWind(IScriptInstance script, Vector3 offset)
 {
     return(Vector3.Zero); // TODO: Wind?
 }
예제 #47
0
파일: Prims.cs 프로젝트: jhurliman/simian
 public void llSetScale(IScriptInstance script, Vector3 scale)
 {
     SetScale(script.Host, scale);
     script.AddSleepMS(200);
 }
예제 #48
0
파일: World.cs 프로젝트: jhurliman/simian
        public Vector3 llGroundContour(IScriptInstance script, Vector3 offset)
        {
            Vector3 slope = llGroundSlope(script, offset);

            return(new Vector3(-slope.Y, slope.X, 0f));
        }
예제 #49
0
 public Vector3 llRot2Up(IScriptInstance script, Quaternion q)
 {
     return llVecNorm(script, Vector3.UnitZ * q);
 }
예제 #50
0
파일: World.cs 프로젝트: jhurliman/simian
        public string llGetDate(IScriptInstance script)
        {
            DateTime now = DateTime.Now;

            return(String.Format("{0}-{1}-{2}", now.Year, now.Month, now.Date));
        }
예제 #51
0
 public double llRound(IScriptInstance script, double val)
 {
     return Math.Round(val);
 }
예제 #52
0
 public float llFloor(IScriptInstance script, float val)
 {
     return((float)Math.Floor(val));
 }
예제 #53
0
 public double llTan(IScriptInstance script, double theta)
 {
     return Math.Tan(theta);
 }
예제 #54
0
 public float llFrand(IScriptInstance script, float mag)
 {
     return((float)Utils.RandomDouble() * (mag - Single.Epsilon));
 }
예제 #55
0
 public double llVecMag(IScriptInstance script, Vector3 vec)
 {
     return vec.Length();
 }
예제 #56
0
        public void OnRemoveScript(uint localID, UUID itemID)
        {
            lock (m_Scripts)
            {
                // Do we even have it?
                if (!m_Scripts.ContainsKey(itemID))
                {
                    return;
                }

                IScriptInstance instance = m_Scripts[itemID];
                m_Scripts.Remove(itemID);

                instance.ClearQueue();
                instance.Stop(0);

                SceneObjectPart part =
                    m_Scene.GetSceneObjectPart(localID);

                if (part != null)
                {
                    part.RemoveScriptEvents(itemID);
                }

//                bool objectRemoved = false;

                lock (m_PrimObjects)
                {
                    // Remove the script from it's prim
                    if (m_PrimObjects.ContainsKey(localID))
                    {
                        // Remove inventory item record
                        if (m_PrimObjects[localID].Contains(itemID))
                        {
                            m_PrimObjects[localID].Remove(itemID);
                        }

                        // If there are no more scripts, remove prim
                        if (m_PrimObjects[localID].Count == 0)
                        {
                            m_PrimObjects.Remove(localID);
//                            objectRemoved = true;
                        }
                    }
                }

                m_DomainScripts[instance.AppDomain].Remove(instance.ItemID);
                if (m_DomainScripts[instance.AppDomain].Count == 0)
                {
                    m_DomainScripts.Remove(instance.AppDomain);
                    UnloadAppDomain(instance.AppDomain);
                }

                instance.RemoveState();
                instance.DestroyScriptInstance();

                instance = null;

                ObjectRemoved handlerObjectRemoved = OnObjectRemoved;
                if (handlerObjectRemoved != null)
                {
                    handlerObjectRemoved(part.UUID);
                }

                CleanAssemblies();
            }

            ScriptRemoved handlerScriptRemoved = OnScriptRemoved;

            if (handlerScriptRemoved != null)
            {
                handlerScriptRemoved(itemID);
            }
        }
예제 #57
0
 public int llAbs(IScriptInstance script, int val)
 {
     return Math.Abs(val);
 }
예제 #58
0
        private void SetPrimParams(IScriptInstance script, ISceneEntity entity, object[] rules)
        {
            LLPrimitive prim = entity as LLPrimitive;

            if (prim == null)
            {
                return;
            }

            bool changedShape = false, changedColor = false, changedTexture = false;

            int i = 0;

            while (i < rules.Length)
            {
                int code = llList2Integer(script, rules, i++);

                switch (code)
                {
                case LSLConstants.PRIM_NAME:
                {
                    SetObjectName(prim, llList2String(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_DESC:
                {
                    SetObjectDesc(prim, llList2String(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_TYPE:
                {
                    SetPrimType(script, rules, ref i);
                    prim.Scene.EntityAddOrUpdate(this, prim, UpdateFlags.Shape, 0);
                    changedShape = true;
                    break;
                }

                case LSLConstants.PRIM_MATERIAL:
                {
                    prim.Prim.PrimData.Material = (Material)llList2Integer(script, rules, i++);
                    prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.Material);
                    break;
                }

                case LSLConstants.PRIM_PHYSICS:
                {
                    SetStatus(prim, LSLConstants.STATUS_PHYSICS, llList2Integer(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_TEMP_ON_REZ:
                {
                    bool        tempOnRez = (llList2Integer(script, rules, i++) != 0);
                    LLPrimitive parent    = GetRootEntity(prim) as LLPrimitive;
                    if (parent != null)
                    {
                        if (tempOnRez)
                        {
                            parent.Prim.Flags |= PrimFlags.TemporaryOnRez;
                        }
                        else
                        {
                            parent.Prim.Flags &= ~PrimFlags.TemporaryOnRez;
                        }
                        parent.Scene.EntityAddOrUpdate(this, parent, 0, (uint)LLUpdateFlags.PrimFlags);
                    }
                    break;
                }

                case LSLConstants.PRIM_PHANTOM:
                {
                    SetStatus(prim, LSLConstants.STATUS_PHANTOM, llList2Integer(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_POSITION:
                {
                    SetPos(prim, llList2Vector(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_ROTATION:
                {
                    SetRot(prim, llList2Rot(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_SIZE:
                {
                    SetScale(prim, llList2Vector(script, rules, i++));
                    break;
                }

                case LSLConstants.PRIM_TEXTURE:
                {
                    int     face       = llList2Integer(script, rules, i++);
                    string  texture    = llList2String(script, rules, i++);
                    Vector3 repeats    = llList2Vector(script, rules, i++);
                    Vector3 offsets    = llList2Vector(script, rules, i++);
                    float   rotRadians = llList2Float(script, rules, i++);

                    SetTexture(script, prim, texture, face);
                    ScaleTexture(script, prim, repeats.X, repeats.Y, face);
                    OffsetTexture(script, prim, offsets.X, offsets.Y, face);
                    RotateTexture(script, prim, rotRadians, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_TEXT:
                {
                    string  text  = llList2String(script, rules, i++);
                    Vector3 color = llList2Vector(script, rules, i++);
                    float   alpha = llList2Float(script, rules, i++);

                    SetText(prim, text, color, alpha);
                    break;
                }

                case LSLConstants.PRIM_COLOR:
                {
                    int     face  = llList2Integer(script, rules, i++);
                    Vector3 color = llList2Vector(script, rules, i++);
                    float   alpha = llList2Float(script, rules, i++);

                    SetColor(prim, color, face);
                    SetAlpha(prim, alpha, face);

                    changedColor = true;
                    break;
                }

                case LSLConstants.PRIM_BUMP_SHINY:
                {
                    int       face  = llList2Integer(script, rules, i++);
                    Shininess shiny = (Shininess)llList2Integer(script, rules, i++);
                    Bumpiness bump  = (Bumpiness)llList2Integer(script, rules, i++);

                    SetShinyBump(prim, shiny, bump, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_POINT_LIGHT:
                {
                    bool    enabled   = (llList2Integer(script, rules, i++) != 0);
                    Vector3 color     = llList2Vector(script, rules, i++);
                    float   intensity = llList2Float(script, rules, i++);
                    float   radius    = llList2Float(script, rules, i++);
                    float   falloff   = llList2Float(script, rules, i++);

                    if (enabled)
                    {
                        Primitive.LightData light = new Primitive.LightData();
                        light.Color = new Color4(
                            Utils.Clamp(color.X, 0f, 1f),
                            Utils.Clamp(color.Y, 0f, 1f),
                            Utils.Clamp(color.Z, 0f, 1f),
                            1f);
                        light.Intensity = intensity;
                        light.Radius    = radius;
                        light.Falloff   = falloff;

                        prim.Prim.Light = light;
                    }
                    else
                    {
                        prim.Prim.Light = null;
                    }

                    prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.ExtraData);
                    break;
                }

                case LSLConstants.PRIM_FULLBRIGHT:
                {
                    int  face       = llList2Integer(script, rules, i++);
                    bool fullbright = (llList2Integer(script, rules, i++) != 0);
                    SetFullbright(prim, fullbright, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_FLEXIBLE:
                {
                    bool    enabled  = (llList2Integer(script, rules, i++) != 0);
                    int     softness = llList2Integer(script, rules, i++);
                    float   gravity  = llList2Float(script, rules, i++);
                    float   friction = llList2Float(script, rules, i++);
                    float   wind     = llList2Float(script, rules, i++);
                    float   tension  = llList2Float(script, rules, i++);
                    Vector3 force    = llList2Vector(script, rules, i++);

                    if (enabled)
                    {
                        Primitive.FlexibleData flex = new Primitive.FlexibleData();
                        flex.Softness = softness;
                        flex.Gravity  = gravity;
                        flex.Drag     = friction;
                        flex.Wind     = wind;
                        flex.Tension  = tension;
                        flex.Force    = force;

                        prim.Prim.Flexible = flex;
                    }
                    else
                    {
                        prim.Prim.Flexible = null;
                    }

                    prim.Scene.EntityAddOrUpdate(this, prim, 0, (uint)LLUpdateFlags.ExtraData);
                    break;
                }

                case LSLConstants.PRIM_TEXGEN:
                {
                    int         face   = llList2Integer(script, rules, i++);
                    MappingType texgen = (MappingType)llList2Integer(script, rules, i++);
                    SetTexgen(prim, texgen, face);

                    changedTexture = true;
                    break;
                }

                case LSLConstants.PRIM_GLOW:
                {
                    int   face      = llList2Integer(script, rules, i++);
                    float intensity = llList2Float(script, rules, i++);
                    SetGlow(prim, intensity, face);

                    changedTexture = true;
                    break;
                }
                }
            }

            if (m_lslScriptEngine != null)
            {
                if (changedShape)
                {
                    m_lslScriptEngine.PostObjectEvent(prim.ID, "changed", new object[] { LSLConstants.CHANGED_SHAPE }, null);
                }
                if (changedTexture)
                {
                    m_lslScriptEngine.PostObjectEvent(prim.ID, "changed", new object[] { LSLConstants.CHANGED_TEXTURE }, null);
                }
                if (changedColor)
                {
                    m_lslScriptEngine.PostObjectEvent(prim.ID, "changed", new object[] { LSLConstants.CHANGED_COLOR }, null);
                }
            }
        }
예제 #59
0
파일: World.cs 프로젝트: jhurliman/simian
 public void llShout(IScriptInstance script, int channelID, string text)
 {
     Say(script, Chat.SHOUT_DIST, text, channelID, EntityChatType.Normal);
 }
예제 #60
0
 public float llRound(IScriptInstance script, float val)
 {
     return((float)Math.Round(val));
 }