Ejemplo n.º 1
0
        public void botSetMap(string keyOfBot, LSL_List positions, LSL_List movementType, LSL_Integer flags)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botSetMap", m_host, "bot", m_itemID))
            {
                return;
            }
            List <Vector3> PositionsMap = new List <Vector3>();

            for (int i = 0; i < positions.Length; i++)
            {
                LSL_Vector pos = positions.GetVector3Item(i);
                PositionsMap.Add(new Vector3((float)pos.x, (float)pos.y, (float)pos.z));
            }
            List <TravelMode> TravelMap = new List <TravelMode>();

            for (int i = 0; i < movementType.Length; i++)
            {
                LSL_Integer travel = movementType.GetLSLIntegerItem(i);
                TravelMap.Add((TravelMode)travel.value);
            }

            IBotManager manager = World.RequestModuleInterface <IBotManager>();

            if (manager != null)
            {
                manager.SetBotMap(UUID.Parse(keyOfBot), PositionsMap, TravelMap, flags.value, m_host.OwnerID);
            }
        }
Ejemplo n.º 2
0
        public LSL_List botGetBotsWithTag(string tag)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botGetBotsWithTag", m_host, "bot", m_itemID))
            {
                return(new LSL_List());
            }
            IBotManager manager = World.RequestModuleInterface <IBotManager>();
            List <UUID> bots    = new List <UUID>();

            if (manager != null)
            {
                bots = manager.GetBotsWithTag(tag);
            }
            LSL_List b = new LSL_List();

            foreach (UUID bot in bots)
            {
                b.Add(bot.ToString());
            }

            return(b);
        }
Ejemplo n.º 3
0
        public LSL_List botGetBotsWithTag(string tag)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botGetBotsWithTag", m_host, "bot", m_itemID))
                return new LSL_List();
            IBotManager manager = World.RequestModuleInterface<IBotManager>();
            List<UUID> bots = new List<UUID>();
            if (manager != null)
                bots = manager.GetBotsWithTag(tag);
            LSL_List b = new LSL_List();
            foreach (UUID bot in bots)
                b.Add(bot.ToString());

            return b;
        }
Ejemplo n.º 4
0
        public LSL_List aaWindlightGetScene(int dayCycleIndex, LSL_List rules)
        {
            IEnvironmentSettingsModule environmentSettings = World.RequestModuleInterface<IEnvironmentSettingsModule>();
            if (environmentSettings == null)
                return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET});
            WindlightDayCycle cycle = environmentSettings.GetCurrentDayCycle();
            if (cycle == null)
                return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET});

            if (cycle.Cycle.IsStaticDayCycle)
                return
                    new LSL_List(new object[2]
                                     {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_SCENE_MUST_NOT_BE_STATIC});

            if (dayCycleIndex >= cycle.Cycle.DataSettings.Count)
                return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_PRESET_FOUND});

            LSL_List list = new LSL_List();
            for (int i = 0; i < rules.Data.Length; i++)
            {
                int rule = rules.GetLSLIntegerItem(i);

                ConvertWindlightDayCycle(cycle, dayCycleIndex, rule, ref list);
            }
            return list;
        }
Ejemplo n.º 5
0
 public void aaSetEnv(LSL_String name, LSL_List value)
 {
     if (!ScriptProtection.CheckThreatLevel(ThreatLevel.VeryHigh, "aaSetEnv", m_host, "AA", m_itemID))
         return;
     if (!World.Permissions.IsGod(m_host.OwnerID))
     {
         LSLError("You do not have god permissions.");
         return;
     }
     if (name == ScriptBaseClass.ENABLE_GRAVITY)
     {
         LSL_Integer enabled = value.GetLSLIntegerItem(0);
         float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce();
         m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(enabled == 1, grav[0], grav[1], grav[2]);
     }
     else if (name == ScriptBaseClass.GRAVITY_FORCE_X)
     {
         LSL_Float f = value.GetLSLFloatItem(0);
         float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce();
         m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(true, (float) f.value, grav[1], grav[2]);
     }
     else if (name == ScriptBaseClass.GRAVITY_FORCE_Y)
     {
         LSL_Float f = value.GetLSLFloatItem(0);
         float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce();
         m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(true, grav[0], (float) f.value, grav[2]);
     }
     else if (name == ScriptBaseClass.GRAVITY_FORCE_Z)
     {
         LSL_Float f = value.GetLSLFloatItem(0);
         float[] grav = m_host.ParentEntity.Scene.PhysicsScene.GetGravityForce();
         m_host.ParentEntity.Scene.PhysicsScene.SetGravityForce(true, grav[0], grav[1], (float) f.value);
     }
     else if (name == ScriptBaseClass.ADD_GRAVITY_POINT)
     {
         LSL_Vector pos = value.GetVector3Item(0);
         LSL_Float gravForce = value.GetLSLFloatItem(1);
         LSL_Float radius = value.GetLSLFloatItem(2);
         LSL_Integer ident = value.GetLSLIntegerItem(3);
         m_host.ParentEntity.Scene.PhysicsScene.AddGravityPoint(false,
                                                                new Vector3((float) pos.x, (float) pos.y,
                                                                            (float) pos.z),
                                                                0, 0, 0, (float) gravForce.value,
                                                                (float) radius.value, ident.value);
     }
     else if (name == ScriptBaseClass.ADD_GRAVITY_FORCE)
     {
         LSL_Vector pos = value.GetVector3Item(0);
         LSL_Float xForce = value.GetLSLFloatItem(1);
         LSL_Float yForce = value.GetLSLFloatItem(2);
         LSL_Float zForce = value.GetLSLFloatItem(3);
         LSL_Float radius = value.GetLSLFloatItem(4);
         LSL_Integer ident = value.GetLSLIntegerItem(5);
         m_host.ParentEntity.Scene.PhysicsScene.AddGravityPoint(true,
                                                                new Vector3((float) pos.x, (float) pos.y,
                                                                            (float) pos.z),
                                                                (float) xForce, (float) yForce, (float) zForce, 0,
                                                                (float) radius.value, ident.value);
     }
     else if (name == ScriptBaseClass.START_TIME_REVERSAL_SAVING)
     {
         IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>();
         if (physicsState != null)
             physicsState.StartSavingPhysicsTimeReversalStates();
     }
     else if (name == ScriptBaseClass.STOP_TIME_REVERSAL_SAVING)
     {
         IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>();
         if (physicsState != null)
             physicsState.StopSavingPhysicsTimeReversalStates();
     }
     else if (name == ScriptBaseClass.START_TIME_REVERSAL)
     {
         IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>();
         if (physicsState != null)
             physicsState.StartPhysicsTimeReversal();
     }
     else if (name == ScriptBaseClass.STOP_TIME_REVERSAL)
     {
         IPhysicsStateModule physicsState = World.RequestModuleInterface<IPhysicsStateModule>();
         if (physicsState != null)
             physicsState.StopPhysicsTimeReversal();
     }
 }
Ejemplo n.º 6
0
        public LSL_List aaQueryDatabase(LSL_String key, LSL_String token)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "aaQueryDatabase", m_host, "AA", m_itemID))
                return new LSL_List();

            List<string> query = AssetConnector.FindLSLData(token.m_string, key.m_string);
            LSL_List list = new LSL_List(query.ToArray());
            return list;
        }
Ejemplo n.º 7
0
 public LSL_List aaDeserializeXMLValues(LSL_String xmlFile)
 {
     if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "aaDeserializeXMLValues", m_host, "AA",
                                            m_itemID)) return new LSL_List();
     XmlDocument doc = new XmlDocument();
     doc.LoadXml(xmlFile.m_string);
     XmlNodeList children = doc.ChildNodes;
     LSL_List values = new LSL_List();
     foreach (XmlNode node in children)
     {
         values.Add(node.InnerText);
     }
     return values;
 }
Ejemplo n.º 8
0
        private void ConvertLSLToWindlight(ref WindlightDayCycle cycle, int preset, LSL_List list)
        {
            var skyDatas = cycle.Cycle.DataSettings.Values.ToList();
            var skyData = skyDatas[preset];

            for (int i = 0; i < list.Data.Length; i += 2)
            {
                int key = list.GetLSLIntegerItem(i);
                switch (key)
                {
                    case ScriptBaseClass.WL_AMBIENT:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.ambient = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_COLOR:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.cloud_color = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_POS_DENSITY1:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.cloud_pos_density1 = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_POS_DENSITY2:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.cloud_pos_density2 = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_SCALE:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.cloud_scale = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_SCROLL_X:
                        {
                            LSL_Integer integer = list.GetLSLIntegerItem(i + 1);
                            skyData.cloud_scroll_rate.X = integer;
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_SCROLL_Y:
                        {
                            LSL_Integer integer = list.GetLSLIntegerItem(i + 1);
                            skyData.cloud_scroll_rate.Y = integer;
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
                        {
                            LSL_Integer integer = list.GetLSLIntegerItem(i + 1);
                            skyData.enable_cloud_scroll.X = integer;
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
                        {
                            LSL_Integer integer = list.GetLSLIntegerItem(i + 1);
                            skyData.enable_cloud_scroll.Y = integer;
                            break;
                        }
                    case ScriptBaseClass.WL_CLOUD_SHADOW:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.cloud_shadow = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_BLUE_DENSITY:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.blue_density = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_BLUR_HORIZON:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.blue_horizon = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_DENSITY_MULTIPLIER:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.density_multiplier = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_DISTANCE_MULTIPLIER:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.distance_multiplier = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_GAMMA:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.gamma = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_GLOW:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.glow = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_HAZE_DENSITY:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.haze_density = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_HAZE_HORIZON:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.haze_horizon = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_LIGHT_NORMALS:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.lightnorm = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_MAX_ALTITUDE:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.max_y = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_STAR_BRIGHTNESS:
                        {
                            LSL_Float f = list.GetLSLFloatItem(i + 1);
                            skyData.star_brightness = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_SKY_SUNLIGHT_COLOR:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            skyData.sunlight_color = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_BIG_WAVE_DIRECTION:
                        {
                            var rot = list.GetVector3Item(i + 1);
                            cycle.Water.wave1Dir = new Vector2((float) rot.x.value, (float) rot.y.value);
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_BLUR_MULTIPLIER:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.blurMultiplier = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_FOG_COLOR:
                        {
                            LSL_Rotation rot = list.GetQuaternionItem(i + 1);
                            cycle.Water.waterFogColor = rot.ToVector4();
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_FOG_DENSITY:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.waterFogDensity = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_FRESNEL_OFFSET:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.fresnelOffset = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_FRESNEL_SCALE:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.fresnelScale = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_LITTLE_WAVE_DIRECTION:
                        {
                            var rot = list.GetVector3Item(i + 1);
                            cycle.Water.wave2Dir = new Vector2((float) rot.x.value, (float) rot.y.value);
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_NORMAL_MAP:
                        {
                            var f = list.GetLSLStringItem(i + 1);
                            cycle.Water.normalMap = UUID.Parse(f.m_string);
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_NORMAL_SCALE:
                        {
                            LSL_Vector rot = list.GetVector3Item(i + 1);
                            cycle.Water.normScale = rot.ToVector3();
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_SCALE_ABOVE:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.scaleAbove = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_SCALE_BELOW:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.scaleBelow = (float) f.value;
                            break;
                        }
                    case ScriptBaseClass.WL_WATER_UNDERWATER_FOG_MODIFIER:
                        {
                            var f = list.GetLSLFloatItem(i + 1);
                            cycle.Water.underWaterFogMod = (float) f.value;
                            break;
                        }
                }
            }
        }
Ejemplo n.º 9
0
        public LSL_List llGetLinkPrimitiveParams(int linknumber, LSL_List rules)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
                return new LSL_List();


            List<ISceneChildEntity> parts = GetLinkParts(linknumber);

            LSL_List res = new LSL_List();

            return parts.Select(part => GetLinkPrimitiveParams(part, rules, m_allowOpenSimParams))
                        .Aggregate(res, (current, partRes) => current + partRes);
        }
Ejemplo n.º 10
0
        public void llGiveInventoryList(string destination, string category, LSL_List inventory)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return;


            UUID destID;
            if (!UUID.TryParse(destination, out destID))
                return;

            List<UUID> itemList = new List<UUID>();

            foreach (object item in inventory.Data)
            {
                UUID itemID;
                if (UUID.TryParse(item.ToString(), out itemID))
                {
                    itemList.Add(itemID);
                }
                else
                {
                    itemID = GetTaskInventoryItem(item.ToString());
                    if (itemID != UUID.Zero)
                        itemList.Add(itemID);
                }
            }

            if (itemList.Count == 0)
                return;
            UUID folderID = UUID.Zero;
            ILLClientInventory inventoryModule = World.RequestModuleInterface<ILLClientInventory>();
            if (inventoryModule != null)
                folderID = inventoryModule.MoveTaskInventoryItemsToUserInventory(destID, category, m_host, itemList);

            if (folderID == UUID.Zero)
                return;

            byte[] bucket = new byte[17];
            bucket[0] = (byte)AssetType.Folder;
            byte[] objBytes = folderID.GetBytes();
            Array.Copy(objBytes, 0, bucket, 1, 16);

            GridInstantMessage msg = new GridInstantMessage()
                {
                    FromAgentID = m_host.UUID,
                    FromAgentName = m_host.Name + ", an object owned by " +
                                                                         resolveName(m_host.OwnerID) + ",",
                    ToAgentID = destID,
                    Dialog = (byte)InstantMessageDialog.InventoryOffered,
                    Message = category + "\n" + m_host.Name + " is located at " +
                                                                   World.RegionInfo.RegionName + " " +
                                                                   m_host.AbsolutePosition,
                    SessionID = folderID,
                    Offline = 1,
                    Position = m_host.AbsolutePosition,
                    BinaryBucket = bucket,
                    RegionID = m_host.ParentEntity.Scene.RegionInfo.RegionID
                };

            if (m_TransferModule != null)
                m_TransferModule.SendInstantMessage(msg);
        }
Ejemplo n.º 11
0
        private void SetParticleSystem(ISceneChildEntity part, LSL_List rules)
        {
            if (rules.Length == 0)
            {
                part.RemoveParticleSystem();
            }
            else
            {
                Primitive.ParticleSystem prules = getNewParticleSystemWithSLDefaultValues();
                LSL_Vector tempv = new LSL_Vector();
                float tempf = 0;
                int tmpi = 0;

                for (int i = 0; i < rules.Length; i += 2)
                {
                        LSL_Integer rule = rules.GetLSLIntegerItem(i);
                        if (rule == (int)ScriptBaseClass.PSYS_PART_FLAGS)
                        {
                            prules.PartDataFlags =
                                (Primitive.ParticleSystem.ParticleDataFlags)(uint)rules.GetLSLIntegerItem(i + 1);
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_START_COLOR)
                        {
                            tempv = rules.GetVector3Item(i + 1);
                            prules.PartStartColor.R = (float)tempv.x;
                            prules.PartStartColor.G = (float)tempv.y;
                            prules.PartStartColor.B = (float)tempv.z;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_START_ALPHA)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.PartStartColor.A = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_END_COLOR)
                        {
                            tempv = rules.GetVector3Item(i + 1);
                            prules.PartEndColor.R = (float)tempv.x;
                            prules.PartEndColor.G = (float)tempv.y;
                            prules.PartEndColor.B = (float)tempv.z;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_END_ALPHA)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.PartEndColor.A = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_START_SCALE)
                        {
                            tempv = rules.GetVector3Item(i + 1);
                            prules.PartStartScaleX = (float)tempv.x;
                            prules.PartStartScaleY = (float)tempv.y;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_END_SCALE)
                        {
                            tempv = rules.GetVector3Item(i + 1);
                            prules.PartEndScaleX = (float)tempv.x;
                            prules.PartEndScaleY = (float)tempv.y;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_MAX_AGE)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.PartMaxAge = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_ACCEL)
                        {
                            tempv = rules.GetVector3Item(i + 1);
                            prules.PartAcceleration.X = (float)tempv.x;
                            prules.PartAcceleration.Y = (float)tempv.y;
                            prules.PartAcceleration.Z = (float)tempv.z;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_PATTERN)
                        {
                            tmpi = rules.GetLSLIntegerItem(i + 1);
                            prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi;
                        }

                            // PSYS_SRC_INNERANGLE and PSYS_SRC_ANGLE_BEGIN use the same variables. The
                        // PSYS_SRC_OUTERANGLE and PSYS_SRC_ANGLE_END also use the same variable. The
                        // client tells the difference between the two by looking at the 0x02 bit in
                        // the PartFlags variable.
                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_INNERANGLE)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.InnerAngle = tempf;
                            prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off.
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.OuterAngle = tempf;
                            prules.PartFlags &= 0xFFFFFFFD; // Make sure new angle format is off.
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_SOURCE)
                        {
                            tmpi = rules.GetLSLIntegerItem(i + 1);
                            prules.BlendFuncSource = (byte)tmpi;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_BLEND_FUNC_DEST)
                        {
                            tmpi = rules.GetLSLIntegerItem(i + 1);
                            prules.BlendFuncDest = (byte)tmpi;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_START_GLOW)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.PartStartGlow = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_PART_END_GLOW)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.PartEndGlow = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_TEXTURE)
                        {
                            prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1), AssetType.Texture, false);
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_RATE)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.BurstRate = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_PART_COUNT)
                        {
                            prules.BurstPartCount = (byte)(int)rules.GetLSLIntegerItem(i + 1);
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_RADIUS)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.BurstRadius = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MIN)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.BurstSpeedMin = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_BURST_SPEED_MAX)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.BurstSpeedMax = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_MAX_AGE)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.MaxAge = tempf;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_TARGET_KEY)
                        {
                            UUID key = UUID.Zero;
                            prules.Target = UUID.TryParse(rules.Data[i + 1].ToString(), out key) ? key : part.UUID;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_OMEGA)
                        {
                            // AL: This is an assumption, since it is the only thing that would match.
                            tempv = rules.GetVector3Item(i + 1);
                            prules.AngularVelocity.X = (float)tempv.x;
                            prules.AngularVelocity.Y = (float)tempv.y;
                            prules.AngularVelocity.Z = (float)tempv.z;
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_ANGLE_BEGIN)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.InnerAngle = tempf;
                            prules.PartFlags |= 0x02; // Set new angle format.
                        }

                        else if (rule == (int)ScriptBaseClass.PSYS_SRC_ANGLE_END)
                        {
                            tempf = (float)rules.GetLSLFloatItem(i + 1);
                            prules.OuterAngle = tempf;
                            prules.PartFlags |= 0x02; // Set new angle format.
                        }
                }
                prules.CRC = 1;

                part.AddNewParticleSystem(prules);
            }
            part.ScheduleUpdate(PrimUpdateFlags.Particles);
        }
Ejemplo n.º 12
0
        public void llParticleSystem(LSL_List rules)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return;

            SetParticleSystem(m_host, rules);
        }
Ejemplo n.º 13
0
        public void llLinkParticleSystem(int linknumber, LSL_List rules)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return;


            List<ISceneChildEntity> parts = GetLinkParts(linknumber);

            foreach (var part in parts)
            {
                SetParticleSystem(part, rules);
            }
        }
Ejemplo n.º 14
0
 public LSL_List llGetAttachedList(string id)
 {
     if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
         return new LSL_List();
     
     IScenePresence av = World.GetScenePresence((UUID)id);
     
     if (av == null || av.IsDeleted)
     	return new LSL_List("NOT FOUND");
     if (av.IsChildAgent || av.IsInTransit)
     	return new LSL_List("NOT ON REGION");
     
     LSL_List AttachmentsList = new LSL_List();
     
     IAttachmentsModule attachMod = World.RequestModuleInterface<IAttachmentsModule>();
     if (attachMod != null)
     {
         ISceneEntity[] Attachments = attachMod.GetAttachmentsForAvatar(av.UUID);
         foreach (ISceneEntity Attachment in Attachments)
         {
         	AttachmentsList.Add(new LSL_Key(Attachment.UUID.ToString()));
         }
     }
     return AttachmentsList;
 }
Ejemplo n.º 15
0
        /// <summary>
        ///     http://wiki.secondlife.com/wiki/LlGetAgentList
        ///     The list of options is currently not used in SL
        ///     scope is one of:-
        ///     AGENT_LIST_REGION - all in the region
        ///     AGENT_LIST_PARCEL - all in the same parcel as the scripted object
        ///     AGENT_LIST_PARCEL_OWNER - all in any parcel owned by the owner of the
        ///     current parcel.
        /// </summary>
        public LSL_List llGetAgentList(LSL_Integer scope, LSL_List options)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
                return new LSL_List();

            // the constants are 1, 2 and 4 so bits are being set, but you
            // get an error "INVALID_SCOPE" if it is anything but 1, 2 and 4
            bool regionWide = scope == ScriptBaseClass.AGENT_LIST_REGION;
            bool parcelOwned = scope == ScriptBaseClass.AGENT_LIST_PARCEL_OWNER;
            bool parcel = scope == ScriptBaseClass.AGENT_LIST_PARCEL;
            LSL_List result = new LSL_List();

            if (!regionWide && !parcelOwned && !parcel)
            {
                result.Add("INVALID_SCOPE");
                return result;
            }

            Vector3 pos;
            UUID id = UUID.Zero;

            if (parcel || parcelOwned)
            {
                pos = m_host.GetWorldPosition();
                IParcelManagementModule parcelManagement = World.RequestModuleInterface<IParcelManagementModule>();
                ILandObject land = parcelManagement.GetLandObject(pos.X, pos.Y);
                if (land == null)
                {
                    id = UUID.Zero;
                }
                else
                {
                    if (parcelOwned)
                    {
                        id = land.LandData.OwnerID;
                    }
                    else
                    {
                        id = land.LandData.GlobalID;
                    }
                }
            }

            World.ForEachScenePresence(
                delegate(IScenePresence ssp) {
                    // Gods are not listed in SL
                    if (!ssp.IsDeleted && FloatAlmostEqual(ssp.GodLevel, 0.0) && !ssp.IsChildAgent) {
                        if (!regionWide) {
                            pos = ssp.AbsolutePosition;
                            IParcelManagementModule parcelManagement = World.RequestModuleInterface<IParcelManagementModule>();
                            ILandObject land = parcelManagement.GetLandObject(pos.X, pos.Y);
                            if (land != null) {
                                if (parcelOwned && land.LandData.OwnerID == id || parcel && land.LandData.GlobalID == id) {
                                    result.Add(ssp.UUID.ToString());
                                }
                            }
                        } else {
                            result.Add(ssp.UUID.ToString());
                        }
                    }
                    // Maximum of 100 results
                    if (result.Length > 99)
                    {
                        return;
                    }
                }
            );

            return result;
        }
Ejemplo n.º 16
0
        /// <summary>
        ///     Returns the index of the first occurrence of test
        ///     in src.
        /// </summary>
        public LSL_Integer llListFindList(LSL_List src, LSL_List test)
        {
            int index = -1;
            int length = src.Length - test.Length + 1;

            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return 0;

            // If either list is empty, do not match
            if (src.Length != 0 && test.Length != 0)
            {
                for (int i = 0; i < length; i++)
                {
                    if (src.Data[i].Equals(test.Data[0]) || test.Data[0].Equals(src.Data[i]))
                    {
                        int j;
                        for (j = 1; j < test.Length; j++)
                            if (!(src.Data[i + j].Equals(test.Data[j]) || test.Data[j].Equals(src.Data[i + j])))
                                break;

                        if (j == test.Length)
                        {
                            index = i;
                            break;
                        }
                    }
                }
            }

            return index;
        }
Ejemplo n.º 17
0
        public LSL_List llGetPrimitiveParams(LSL_List rules)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
                return new LSL_List();

            return GetLinkPrimitiveParams(m_host, rules, m_allowOpenSimParams);
        }
Ejemplo n.º 18
0
        public LSL_String llDumpList2String(LSL_List src, string seperator)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return "";

            if (src.Length == 0)
            {
                return string.Empty;
            }

            string ret = src.Data.Aggregate("", (current, o) => current + (o + seperator));

            ret = ret.Substring(0, ret.Length - seperator.Length);
            return ret;
        }
Ejemplo n.º 19
0
        public LSL_List GetLinkPrimitiveParams(ISceneChildEntity part, LSL_List rules, bool allowOpenSimParams)
        {
            LSL_List res = new LSL_List();
            int idx = 0;
            while (idx < rules.Length)
            {
                int code = rules.GetLSLIntegerItem(idx++);
                int remain = rules.Length - idx;
                Primitive.TextureEntry tex = part.Shape.Textures;
                int face = 0;

                if (code == (int)ScriptBaseClass.PRIM_NAME)
                {
                    res.Add(new LSL_String(part.Name));
                }

                else if (code == (int)ScriptBaseClass.PRIM_DESC)
                {
                    res.Add(new LSL_String(part.Description));
                }

                else if (code == (int)ScriptBaseClass.PRIM_MATERIAL)
                {
                    res.Add(new LSL_Integer(part.Material));
                }

                else if (code == (int)ScriptBaseClass.PRIM_PHYSICS)
                {
                    res.Add((part.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) != 0
                                ? new LSL_Integer(1)
                                : new LSL_Integer(0));
                }

                else if (code == (int)ScriptBaseClass.PRIM_TEMP_ON_REZ)
                {
                    res.Add((part.GetEffectiveObjectFlags() & (uint)PrimFlags.TemporaryOnRez) != 0
                                ? new LSL_Integer(1)
                                : new LSL_Integer(0));
                }

                else if (code == (int)ScriptBaseClass.PRIM_PHANTOM)
                {
                    res.Add((part.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0
                                ? new LSL_Integer(1)
                                : new LSL_Integer(0));
                }

                else if (code == (int)ScriptBaseClass.PRIM_POSITION)
                {
                    Vector3 tmp = part.AbsolutePosition;
                    LSL_Vector v = new LSL_Vector(tmp.X,
                                                  tmp.Y,
                                                  tmp.Z);
                    // For some reason, the part.AbsolutePosition.* values do not change if the
                    // linkset is rotated; they always reflect the child prim's world position
                    // as though the linkset is unrotated. This is incompatible behavior with SL's
                    // implementation, so will break scripts imported from there (not to mention it
                    // makes it more difficult to determine a child prim's actual inworld position).
                    if (part.ParentID != 0)
                    {
                        LSL_Rotation rtmp = llGetRootRotation();
                        LSL_Vector rpos = llGetRootPosition();
                        v = ((v - rpos) * rtmp) + rpos;
                    }
                    res.Add(v);
                }
                else if (code == (int)ScriptBaseClass.PRIM_POS_LOCAL)
                {
                    res.Add(GetLocalPos(part));
                }
                else if (code == (int)ScriptBaseClass.PRIM_SIZE)
                {
                    Vector3 tmp = part.Scale;
                    res.Add(new LSL_Vector(tmp.X,
                                           tmp.Y,
                                           tmp.Z));
                }

                else if (code == (int)ScriptBaseClass.PRIM_ROTATION)
                {
                    res.Add(GetPartRot(part));
                }

                else if (code == (int)ScriptBaseClass.PRIM_TYPE)
                {
                    // implementing box
                    PrimitiveBaseShape Shape = part.Shape;
                    int primType = (int)part.GetPrimType();
                    res.Add(new LSL_Integer(primType));
                    double topshearx = (sbyte)Shape.PathShearX / 100.0; // Fix negative values for PathShearX
                    double topsheary = (sbyte)Shape.PathShearY / 100.0; // and PathShearY.
                    if (primType == ScriptBaseClass.PRIM_TYPE_BOX ||
                        primType == ScriptBaseClass.PRIM_TYPE_CYLINDER ||
                        primType == ScriptBaseClass.PRIM_TYPE_PRISM)
                    {
                        res.Add(new LSL_Integer(Shape.ProfileCurve));
                        res.Add(new LSL_Vector(Shape.ProfileBegin / 50000.0, 1 - Shape.ProfileEnd / 50000.0, 0));
                        res.Add(new LSL_Float(Shape.ProfileHollow / 50000.0));
                        res.Add(new LSL_Vector(Shape.PathTwistBegin / 100.0, Shape.PathTwist / 100.0, 0));
                        res.Add(new LSL_Vector(1 - (Shape.PathScaleX / 100.0 - 1), 1 - (Shape.PathScaleY / 100.0 - 1), 0));
                        res.Add(new LSL_Vector(topshearx, topsheary, 0));
                    }

                    if (primType == ScriptBaseClass.PRIM_TYPE_SPHERE)
                    {
                        res.Add(new LSL_Integer(Shape.ProfileCurve));
                        res.Add(new LSL_Vector(Shape.PathBegin / 50000.0, 1 - Shape.PathEnd / 50000.0, 0));
                        res.Add(new LSL_Float(Shape.ProfileHollow / 50000.0));
                        res.Add(new LSL_Vector(Shape.PathTwistBegin / 100.0, Shape.PathTwist / 100.0, 0));
                        res.Add(new LSL_Vector(Shape.ProfileBegin / 50000.0, 1 - Shape.ProfileEnd / 50000.0, 0));
                    }

                    if (primType == ScriptBaseClass.PRIM_TYPE_SCULPT)
                    {
                        res.Add(Shape.SculptTexture.ToString());
                        res.Add(new LSL_Integer(Shape.SculptType));
                    }
                    if (primType == ScriptBaseClass.PRIM_TYPE_RING ||
                        primType == ScriptBaseClass.PRIM_TYPE_TUBE ||
                        primType == ScriptBaseClass.PRIM_TYPE_TORUS)
                    {
                        // holeshape
                        res.Add(new LSL_Integer(Shape.ProfileCurve));

                        // cut
                        res.Add(new LSL_Vector(Shape.PathBegin / 50000.0, 1 - Shape.PathEnd / 50000.0, 0));

                        // hollow
                        res.Add(new LSL_Float(Shape.ProfileHollow / 50000.0));

                        // twist
                        res.Add(new LSL_Vector(Shape.PathTwistBegin / 100.0, Shape.PathTwist / 100.0, 0));

                        // vector holesize
                        res.Add(new LSL_Vector(1 - (Shape.PathScaleX / 100.0 - 1), 1 - (Shape.PathScaleY / 100.0 - 1), 0));

                        // vector topshear
                        res.Add(new LSL_Vector(topshearx, topsheary, 0));

                        // vector profilecut
                        res.Add(new LSL_Vector(Shape.ProfileBegin / 50000.0, 1 - Shape.ProfileEnd / 50000.0, 0));

                        // vector tapera
                        res.Add(new LSL_Vector(Shape.PathTaperX / 100.0, Shape.PathTaperY / 100.0, 0));

                        // float revolutions
                        res.Add(
                            new LSL_Float(Math.Round(Shape.PathRevolutions * 0.015d, 2, MidpointRounding.AwayFromZero)) +
                            1.0d);
                        // 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).
                        //
                        // Using these formulas to store and retrieve PathRevolutions, it is not
                        // possible to use all values between 1.00 and 4.00. For instance, you can't
                        // represent 1.10. You can represent 1.09 and 1.11, but not 1.10. So, if you
                        // use llSetPrimitiveParams to set revolutions to 1.10 and then retreive them
                        // with llGetPrimitiveParams, you'll retrieve 1.09. You can also see a similar
                        // behavior in the viewer as you cannot set 1.10. The viewer jumps to 1.11.
                        // In SL, llSetPrimitveParams and llGetPrimitiveParams can set and get a value
                        // such as 1.10. So, SL must store and retreive the actual user input rather
                        // than only storing the encoded value.

                        // float radiusoffset
                        res.Add(new LSL_Float(Shape.PathRadiusOffset / 100.0));

                        // float skew
                        res.Add(new LSL_Float(Shape.PathSkew / 100.0));
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_TEXTURE)
                {
                    if (remain < 1)
                        return res;
                    face = rules.GetLSLIntegerItem(idx++);
                    if (face == ScriptBaseClass.ALL_SIDES)
                    {
                        for (face = 0; face < GetNumberOfSides(part); face++)
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);

                            res.Add(new LSL_String(texface.TextureID.ToString()));
                            res.Add(new LSL_Vector(texface.RepeatU,
                                                   texface.RepeatV,
                                                   0));
                            res.Add(new LSL_Vector(texface.OffsetU,
                                                   texface.OffsetV,
                                                   0));
                            res.Add(new LSL_Float(texface.Rotation));
                        }
                    }
                    else
                    {
                        if (face >= 0 && face < GetNumberOfSides(part))
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);

                            res.Add(new LSL_String(texface.TextureID.ToString()));
                            res.Add(new LSL_Vector(texface.RepeatU,
                                                   texface.RepeatV,
                                                   0));
                            res.Add(new LSL_Vector(texface.OffsetU,
                                                   texface.OffsetV,
                                                   0));
                            res.Add(new LSL_Float(texface.Rotation));
                        }
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_COLOR)
                {
                    if (remain < 1)
                        return res;
                    face = rules.GetLSLIntegerItem(idx++);
                    tex = part.Shape.Textures;
                    Color4 texcolor;
                    if (face == ScriptBaseClass.ALL_SIDES)
                    {
                        for (face = 0; face < GetNumberOfSides(part); face++)
                        {
                            texcolor = tex.GetFace((uint)face).RGBA;
                            res.Add(new LSL_Vector(texcolor.R,
                                                   texcolor.G,
                                                   texcolor.B));
                            res.Add(new LSL_Float(texcolor.A));
                        }
                    }
                    else
                    {
                        texcolor = tex.GetFace((uint)face).RGBA;
                        res.Add(new LSL_Vector(texcolor.R,
                                               texcolor.G,
                                               texcolor.B));
                        res.Add(new LSL_Float(texcolor.A));
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_BUMP_SHINY)
                {
                    if (remain < 1)
                        return res;

                    face = rules.GetLSLIntegerItem(idx++);

                    if (face == ScriptBaseClass.ALL_SIDES)
                    {
                        for (face = 0; face < GetNumberOfSides(part); face++)
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
                            // Convert Shininess to PRIM_SHINY_*
                            res.Add(new LSL_Integer((uint)texface.Shiny >> 6));
                            // PRIM_BUMP_*
                            res.Add(new LSL_Integer((int)texface.Bump));
                        }
                    }
                    else
                    {
                        if (face >= 0 && face < GetNumberOfSides(part))
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
                            // Convert Shininess to PRIM_SHINY_*
                            res.Add(new LSL_Integer((uint)texface.Shiny >> 6));
                            // PRIM_BUMP_*
                            res.Add(new LSL_Integer((int)texface.Bump));
                        }
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_FULLBRIGHT)
                {
                    if (remain < 1)
                        return res;

                    face = rules.GetLSLIntegerItem(idx++);
                    tex = part.Shape.Textures;
                    if (face == ScriptBaseClass.ALL_SIDES)
                    {
                        for (face = 0; face < GetNumberOfSides(part); face++)
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
                            res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0));
                        }
                    }
                    else
                    {
                        if (face >= 0 && face < GetNumberOfSides(part))
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
                            res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0));
                        }
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_FLEXIBLE)
                {
                    PrimitiveBaseShape shape = part.Shape;

                    res.Add(shape.FlexiEntry ? new LSL_Integer(1) : new LSL_Integer(0));
                    res.Add(new LSL_Integer(shape.FlexiSoftness)); // softness
                    res.Add(new LSL_Float(shape.FlexiGravity)); // gravity
                    res.Add(new LSL_Float(shape.FlexiDrag)); // friction
                    res.Add(new LSL_Float(shape.FlexiWind)); // wind
                    res.Add(new LSL_Float(shape.FlexiTension)); // tension
                    res.Add(new LSL_Vector(shape.FlexiForceX, // force
                                           shape.FlexiForceY,
                                           shape.FlexiForceZ));
                }

                else if (code == (int)ScriptBaseClass.PRIM_TEXGEN)
                {
                    if (remain < 1)
                        return res;

                    face = rules.GetLSLIntegerItem(idx++);
                    if (face == ScriptBaseClass.ALL_SIDES)
                    {
                        for (face = 0; face < GetNumberOfSides(part); face++)
                        {
                            MappingType texgen = tex.GetFace((uint)face).TexMapType;
                            // Convert MappingType to PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR etc.
                            res.Add(new LSL_Integer((uint)texgen >> 1));
                        }
                    }
                    else
                    {
                        if (face >= 0 && face < GetNumberOfSides(part))
                        {
                            MappingType texgen = tex.GetFace((uint)face).TexMapType;
                            res.Add(new LSL_Integer((uint)texgen >> 1));
                        }
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_POINT_LIGHT)
                {
                    PrimitiveBaseShape shape = part.Shape;

                    res.Add(shape.LightEntry ? new LSL_Integer(1) : new LSL_Integer(0));
                    res.Add(new LSL_Vector(shape.LightColorR, // color
                                           shape.LightColorG,
                                           shape.LightColorB));
                    res.Add(new LSL_Float(shape.LightIntensity)); // intensity
                    res.Add(new LSL_Float(shape.LightRadius)); // radius
                    res.Add(new LSL_Float(shape.LightFalloff)); // falloff
                }

                else if (code == (int)ScriptBaseClass.PRIM_GLOW)
                {
                    if (remain < 1)
                        return res;

                    face = rules.GetLSLIntegerItem(idx++);
                    if (face == ScriptBaseClass.ALL_SIDES)
                    {
                        for (face = 0; face < GetNumberOfSides(part); face++)
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
                            res.Add(new LSL_Float(texface.Glow));
                        }
                    }
                    else
                    {
                        if (face >= 0 && face < GetNumberOfSides(part))
                        {
                            Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
                            res.Add(new LSL_Float(texface.Glow));
                        }
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_TEXT)
                {
                    Color4 textColor = part.GetTextColor();
                    res.Add(new LSL_String(part.Text));
                    res.Add(new LSL_Vector(textColor.R,
                                           textColor.G,
                                           textColor.B));
                    res.Add(new LSL_Float(1 - textColor.A));
                }
                else if (code == (int)ScriptBaseClass.PRIM_ROT_LOCAL)
                {
                    Quaternion rtmp = part.GetRotationOffset();
                    res.Add(new LSL_Rotation(rtmp.X, rtmp.Y, rtmp.Z, rtmp.W));
                }
                else if (code == (int)ScriptBaseClass.PRIM_OMEGA)
                {
                    Vector3 axis = part.OmegaAxis;
                    LSL_Float spinRate = part.OmegaSpinRate;
                    LSL_Float gain = part.OmegaGain;
                    res.Add(axis);
                    res.Add(spinRate);
                    res.Add(gain);
                }
                else if (code == (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE)
                {
                    res.Add(new LSL_Integer(part.PhysicsType));
                }
                else if (code == (int)ScriptBaseClass.PRIM_LINK_TARGET)
                {
                    if (remain < 1)
                        continue;
                    LSL_Integer nextLink = rules.GetLSLIntegerItem(idx++);
                    List<ISceneChildEntity> entities = GetLinkParts(nextLink);
                    if (entities.Count > 0)
                        part = entities[0];
                }
                else if (code == (int)ScriptBaseClass.OS_PRIM_PROJECTION)
                {
                    if (!allowOpenSimParams)
                        return null;
                    res.Add((LSL_Integer)(
                            part.Shape.ProjectionEntry ? 1 : 0));
                    res.Add((LSL_Key)part.Shape.ProjectionTextureUUID.ToString());
                    res.Add((LSL_Float)part.Shape.ProjectionFOV);
                    res.Add((LSL_Float)part.Shape.ProjectionFocus);
                    res.Add((LSL_Float)part.Shape.ProjectionAmbiance);
                }
                else if (code == (int)ScriptBaseClass.OS_PRIM_VELOCITY)
                {
                    if (!allowOpenSimParams)
                        return null;
                    res.Add(new LSL_Vector(part.Velocity));
                }
                else if (code == (int)ScriptBaseClass.OS_PRIM_ACCELERATION)
                {
                    if (!allowOpenSimParams)
                        return null;
                    res.Add(new LSL_Vector(part.Acceleration));
                }
            }
            return res;
        }
Ejemplo n.º 20
0
        public DateTime llDialog(string avatar, string message, LSL_List buttons, int chat_channel)
        {
            IDialogModule dm = World.RequestModuleInterface<IDialogModule>();

            if (dm == null)
                return DateTime.Now;

            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
                return DateTime.Now;

            UUID av = new UUID();
            if (!UUID.TryParse(avatar, out av))
            {
                //Silently accepted in in SL NOTE: it does sleep though!
                //LSLError("First parameter to llDialog needs to be a key");
                return PScriptSleep(m_sleepMsOnDialog);
            }
            if (buttons.Length > 12)
            {
                Error("llDialog", "No more than 12 buttons can be shown");
                return DateTime.Now;
            }
            string[] buts = new string[buttons.Length];
            for (int i = 0; i < buttons.Length; i++)
            {
                if (buttons.Data[i].ToString() == string.Empty)
                {
                    Error("llDialog", "Button label cannot be blank");
                    return DateTime.Now;
                }
                if (buttons.Data[i].ToString().Length > 24)
                {
                    Error("llDialog", "Button label cannot be longer than 24 characters");
                    return DateTime.Now;
                }
                buts[i] = buttons.Data[i].ToString();
            }
            if (buts.Length == 0)
                buts = new[] { "OK" };

            dm.SendDialogToUser(
                av, m_host.Name, m_host.UUID, m_host.OwnerID,
                message, new UUID("00000000-0000-2222-3333-100000001000"), chat_channel, buts);

            return PScriptSleep(m_sleepMsOnDialog);
        }
Ejemplo n.º 21
0
        private void ConvertWindlightDayCycle(WindlightDayCycle cycle, int preset, int rule, ref LSL_List list)
        {
            var skyDatas = cycle.Cycle.DataSettings.Values.ToList();
            var skyData = skyDatas[preset];

            switch (rule)
            {
                case (int) ScriptBaseClass.WL_AMBIENT:
                    list.Add(new LSL_Rotation(skyData.ambient.X, skyData.ambient.Y,
                                              skyData.ambient.Z, skyData.ambient.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_BLUE_DENSITY:
                    list.Add(new LSL_Rotation(skyData.blue_density.X, skyData.blue_density.Y,
                                              skyData.blue_density.Z, skyData.blue_density.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_BLUR_HORIZON:
                    list.Add(new LSL_Rotation(skyData.blue_horizon.X, skyData.blue_horizon.Y,
                                              skyData.blue_horizon.Z, skyData.blue_horizon.W));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_COLOR:
                    list.Add(new LSL_Rotation(skyData.cloud_color.X, skyData.cloud_color.Y,
                                              skyData.cloud_color.Z, skyData.cloud_color.W));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_POS_DENSITY1:
                    list.Add(new LSL_Rotation(skyData.cloud_pos_density1.X, skyData.cloud_pos_density1.Y,
                                              skyData.cloud_pos_density1.Z, skyData.cloud_pos_density1.W));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_POS_DENSITY2:
                    list.Add(new LSL_Rotation(skyData.cloud_pos_density2.X, skyData.cloud_pos_density2.Y,
                                              skyData.cloud_pos_density2.Z, skyData.cloud_pos_density2.W));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_SCALE:
                    list.Add(new LSL_Rotation(skyData.cloud_scale.X, skyData.cloud_scale.Y,
                                              skyData.cloud_scale.Z, skyData.cloud_scale.W));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_SCROLL_X:
                    list.Add(new LSL_Float(skyData.cloud_scroll_rate.X));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
                    list.Add(new LSL_Integer(skyData.enable_cloud_scroll.X));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_SCROLL_Y:
                    list.Add(new LSL_Float(skyData.cloud_scroll_rate.Y));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
                    list.Add(new LSL_Integer(skyData.enable_cloud_scroll.Y));
                    break;
                case (int) ScriptBaseClass.WL_CLOUD_SHADOW:
                    list.Add(new LSL_Rotation(skyData.cloud_shadow.X, skyData.cloud_shadow.Y, skyData.cloud_shadow.Z,
                                              skyData.cloud_shadow.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_DENSITY_MULTIPLIER:
                    list.Add(new LSL_Rotation(skyData.density_multiplier.X, skyData.density_multiplier.Y,
                                              skyData.density_multiplier.Z, skyData.density_multiplier.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_DISTANCE_MULTIPLIER:
                    list.Add(new LSL_Rotation(skyData.distance_multiplier.X, skyData.distance_multiplier.Y,
                                              skyData.distance_multiplier.Z, skyData.distance_multiplier.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_GAMMA:
                    list.Add(new LSL_Rotation(skyData.gamma.X, skyData.gamma.Y, skyData.gamma.Z, skyData.gamma.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_GLOW:
                    list.Add(new LSL_Rotation(skyData.glow.X, skyData.glow.Y, skyData.glow.Z, skyData.glow.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_HAZE_DENSITY:
                    list.Add(new LSL_Rotation(skyData.haze_density.X, skyData.haze_density.Y, skyData.haze_density.Z,
                                              skyData.haze_density.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_HAZE_HORIZON:
                    list.Add(new LSL_Rotation(skyData.haze_horizon.X, skyData.haze_horizon.Y, skyData.haze_horizon.Z,
                                              skyData.haze_horizon.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_LIGHT_NORMALS:
                    list.Add(new LSL_Rotation(skyData.lightnorm.X, skyData.lightnorm.Y, skyData.lightnorm.Z,
                                              skyData.lightnorm.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_MAX_ALTITUDE:
                    list.Add(new LSL_Rotation(skyData.max_y.X, skyData.max_y.Y, skyData.max_y.Z, skyData.max_y.W));
                    break;
                case (int) ScriptBaseClass.WL_SKY_STAR_BRIGHTNESS:
                    list.Add(new LSL_Float(skyData.star_brightness));
                    break;
                case (int) ScriptBaseClass.WL_SKY_SUNLIGHT_COLOR:
                    list.Add(new LSL_Rotation(skyData.sunlight_color.X, skyData.sunlight_color.Y,
                                              skyData.sunlight_color.Z, skyData.sunlight_color.W));
                    break;

                case (int) ScriptBaseClass.WL_WATER_BLUR_MULTIPLIER:
                    list.Add(new LSL_Float(cycle.Water.blurMultiplier));
                    break;
                case (int) ScriptBaseClass.WL_WATER_FRESNEL_OFFSET:
                    list.Add(new LSL_Float(cycle.Water.fresnelOffset));
                    break;
                case (int) ScriptBaseClass.WL_WATER_FRESNEL_SCALE:
                    list.Add(new LSL_Float(cycle.Water.fresnelScale));
                    break;
                case (int) ScriptBaseClass.WL_WATER_NORMAL_MAP:
                    list.Add(new LSL_String(cycle.Water.normalMap));
                    break;
                case (int) ScriptBaseClass.WL_WATER_NORMAL_SCALE:
                    list.Add(new LSL_Vector(cycle.Water.normScale.X, cycle.Water.normScale.Y,
                                            cycle.Water.normScale.Z));
                    break;
                case (int) ScriptBaseClass.WL_WATER_SCALE_ABOVE:
                    list.Add(new LSL_Float(cycle.Water.scaleAbove));
                    break;
                case (int) ScriptBaseClass.WL_WATER_SCALE_BELOW:
                    list.Add(new LSL_Float(cycle.Water.scaleBelow));
                    break;
                case (int) ScriptBaseClass.WL_WATER_UNDERWATER_FOG_MODIFIER:
                    list.Add(new LSL_Float(cycle.Water.underWaterFogMod));
                    break;
                case (int) ScriptBaseClass.WL_WATER_FOG_COLOR:
                    list.Add(new LSL_Rotation(cycle.Water.waterFogColor.X, cycle.Water.waterFogColor.Y,
                                              cycle.Water.waterFogColor.Z,
                                              cycle.Water.waterFogColor.W));
                    break;
                case (int) ScriptBaseClass.WL_WATER_FOG_DENSITY:
                    list.Add(new LSL_Float(cycle.Water.waterFogDensity));
                    break;
                case (int) ScriptBaseClass.WL_WATER_BIG_WAVE_DIRECTION:
                    list.Add(new LSL_Vector(cycle.Water.wave1Dir.X,
                                            cycle.Water.wave1Dir.Y, 0.0f));
                    break;
                case (int) ScriptBaseClass.WL_WATER_LITTLE_WAVE_DIRECTION:
                    list.Add(new LSL_Vector(cycle.Water.wave2Dir.X,
                                            cycle.Water.wave2Dir.Y, 0.0f));
                    break;
            }
        }
Ejemplo n.º 22
0
        public void llSetPrimitiveParams(LSL_List rules)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return;

            SetPrimParams(m_host, rules, m_allowOpenSimParams);
            PScriptSleep(m_sleepMsOnSetPrimitiveParams);
        }
Ejemplo n.º 23
0
 public LSL_List aaGetTeamMembers(LSL_String team)
 {
     if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Low, "aaGetTeamMembers", m_host, "AA", m_itemID))
         return new LSL_List();
     List<UUID> Members = new List<UUID>();
     ICombatModule module = World.RequestModuleInterface<ICombatModule>();
     if (module != null)
     {
         Members = module.GetTeammates(team);
     }
     LSL_List members = new LSL_List();
     foreach (UUID member in Members)
         members.Add(new LSL_Key(member.ToString()));
     return members;
 }
Ejemplo n.º 24
0
        public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) 
                return;


            List<IEntity> parts = GetLinkPartsAndEntities(linknumber);

            foreach (IEntity part in parts)
                SetPrimParams(part, rules, m_allowOpenSimParams);

            PScriptSleep(m_sleepMsOnSetLinkPrimitiveParams);
        }
Ejemplo n.º 25
0
 public LSL_String aaSerializeXML(LSL_List keys, LSL_List values)
 {
     if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "aaSerializeXML", m_host, "AA", m_itemID))
         return new LSL_String();
     XmlDocument doc = new XmlDocument();
     for (int i = 0; i < keys.Length; i++)
     {
         string key = keys.GetLSLStringItem(i);
         string value = values.GetLSLStringItem(i);
         XmlNode node = doc.CreateNode(XmlNodeType.Element, key, "");
         node.InnerText = value;
         doc.AppendChild(node);
     }
     return new LSL_String(doc.OuterXml);
 }
Ejemplo n.º 26
0
        public void llSetLinkPrimitiveParamsFast(int linknumber, LSL_List rules)
        {
            List<ISceneChildEntity> parts = GetLinkParts(linknumber);

            foreach (ISceneChildEntity part in parts)
                SetPrimParams(part, rules, m_allowOpenSimParams);
        }
Ejemplo n.º 27
0
        public LSL_List aaWindlightGetDayCycle()
        {
            IEnvironmentSettingsModule environmentSettings = World.RequestModuleInterface<IEnvironmentSettingsModule>();
            if (environmentSettings == null)
                return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET});
            WindlightDayCycle cycle = environmentSettings.GetCurrentDayCycle();
            if (cycle == null)
                return new LSL_List(new object[2] {ScriptBaseClass.WL_ERROR, ScriptBaseClass.WL_ERROR_NO_SCENE_SET});

            if (cycle.Cycle.IsStaticDayCycle)
                return new LSL_List(new object[3] {0, -1, cycle.Cycle.DataSettings["-1"].preset_name});

            LSL_List list = new LSL_List();

            int i = 0;
            foreach (var key in cycle.Cycle.DataSettings)
            {
                list.Add(i++);
                list.Add(key.Key);
                list.Add(key.Value.preset_name);
            }
            return list;
        }
Ejemplo n.º 28
0
        public void SetPrimParams(IEntity part, LSL_List rules, bool allowOpenSimParams)
        {
            int idx = 0;

            while (idx < rules.Length)
            {
                int code = rules.GetLSLIntegerItem(idx++);

                int remain = rules.Length - idx;

                int face;
                LSL_Vector v;

                if (code == (int)ScriptBaseClass.PRIM_NAME)
                {
                    if (remain < 1)
                        return;

                    string name = rules.Data[idx++].ToString();
                    if (part is ISceneChildEntity)
                        (part as ISceneChildEntity).Name = name;
                }

                else if (code == (int)ScriptBaseClass.PRIM_DESC)
                {
                    if (remain < 1)
                        return;

                    string desc = rules.Data[idx++].ToString();
                    if (part is ISceneChildEntity)
                        (part as ISceneChildEntity).Description = desc;
                }

                else if (code == (int)ScriptBaseClass.PRIM_ROT_LOCAL)
                {
                    if (remain < 1)
                        return;
                    LSL_Rotation lr = rules.GetQuaternionItem(idx++);
                    if (part is ISceneChildEntity)
                        SetRot((part as ISceneChildEntity), Rot2Quaternion(lr));
                }

                else if (code == (int)ScriptBaseClass.PRIM_POSITION)
                {
                    if (remain < 1)
                        return;

                    v = rules.GetVector3Item(idx++);
                    if (part is ISceneChildEntity)
                        //SetPos(part as ISceneChildEntity, GetPartLocalPos(part as ISceneChildEntity) + v, true);
                        SetPos(part as ISceneChildEntity, v, true);
                    else if (part is IScenePresence)
                    {
                        (part as IScenePresence).OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
                        (part as IScenePresence).SendTerseUpdateToAllClients();
                    }
                }
                else if (code == (int)ScriptBaseClass.PRIM_POS_LOCAL)
                {
                    if (remain < 1)
                        return;

                    v = rules.GetVector3Item(idx++);
                    if (part is ISceneChildEntity)
                    {
                        if (((ISceneChildEntity)part).ParentID != 0)
                            ((ISceneChildEntity)part).OffsetPosition = new Vector3((float)v.x, (float)v.y,
                                                                                    (float)v.z);
                        else
                            part.AbsolutePosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
                    }
                    else if (part is IScenePresence)
                    {
                        (part as IScenePresence).OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z);
                        (part as IScenePresence).SendTerseUpdateToAllClients();
                    }
                }
                else if (code == (int)ScriptBaseClass.PRIM_SIZE)
                {
                    if (remain < 1)
                        return;


                    v = rules.GetVector3Item(idx++);
                    if (part is ISceneChildEntity)
                        SetScale(part as ISceneChildEntity, v);
                }
                else if (code == (int)ScriptBaseClass.PRIM_ROTATION)
                {
                    if (remain < 1)
                        return;

                    LSL_Rotation q = rules.GetQuaternionItem(idx++);
                    if (part is ISceneChildEntity)
                    {
                        // try to let this work as in SL...
                        if ((part as ISceneChildEntity).ParentID == 0)
                        {
                            // special case: If we are root, rotate complete SOG to new rotation
                            SetRot(part as ISceneChildEntity, Rot2Quaternion(q));
                        }
                        else
                        {
                            // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
                            ISceneEntity group = (part as ISceneChildEntity).ParentEntity;
                            if (group != null) // a bit paranoid, maybe
                            {
                                ISceneChildEntity rootPart = group.RootChild;
                                if (rootPart != null) // again, better safe than sorry
                                {
                                    SetRot((part as ISceneChildEntity), rootPart.GetRotationOffset() * Rot2Quaternion(q));
                                }
                            }
                        }
                    }
                    else if (part is IScenePresence)
                    {
                        IScenePresence sp = (IScenePresence)part;
                        ISceneChildEntity childObj = sp.Scene.GetSceneObjectPart(sp.SittingOnUUID);
                        if (childObj != null)
                        {
                            sp.Rotation = childObj.ParentEntity.GroupRotation * Rot2Quaternion(q);
                            sp.SendTerseUpdateToAllClients();
                        }
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_TYPE)
                {
                    if (remain < 3)
                        return;

                    if (part is ISceneChildEntity)
                    {
                    }
                    else
                        return;

                    code = rules.GetLSLIntegerItem(idx++);

                    remain = rules.Length - idx;
                    float hollow;
                    LSL_Vector twist;
                    LSL_Vector taper_b;
                    LSL_Vector topshear;
                    float revolutions;
                    float radiusoffset;
                    float skew;
                    LSL_Vector holesize;
                    LSL_Vector profilecut;

                    if (code == (int)ScriptBaseClass.PRIM_TYPE_BOX)
                    {
                        if (remain < 6)
                            return;

                        face = rules.GetLSLIntegerItem(idx++);
                        v = rules.GetVector3Item(idx++); // cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++);
                        topshear = rules.GetVector3Item(idx++);

                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Straight;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, topshear,
                                                1);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_CYLINDER)
                    {
                        if (remain < 6)
                            return;

                        face = rules.GetLSLIntegerItem(idx++); // holeshape
                        v = rules.GetVector3Item(idx++); // cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++);
                        topshear = rules.GetVector3Item(idx++);
                        (part as ISceneChildEntity).Shape.ProfileShape = ProfileShape.Circle;
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Straight;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, topshear,
                                                0);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_PRISM)
                    {
                        if (remain < 6)
                            return;

                        face = rules.GetLSLIntegerItem(idx++); // holeshape
                        v = rules.GetVector3Item(idx++); //cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++);
                        topshear = rules.GetVector3Item(idx++);
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Straight;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, topshear,
                                                3);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_SPHERE)
                    {
                        if (remain < 5)
                            return;

                        face = rules.GetLSLIntegerItem(idx++); // holeshape
                        v = rules.GetVector3Item(idx++); // cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++); // dimple
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, taper_b, 5);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_TORUS)
                    {
                        if (remain < 11)
                            return;

                        face = rules.GetLSLIntegerItem(idx++); // holeshape
                        v = rules.GetVector3Item(idx++); //cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        holesize = rules.GetVector3Item(idx++);
                        topshear = rules.GetVector3Item(idx++);
                        profilecut = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++); // taper_a
                        revolutions = (float)rules.GetLSLFloatItem(idx++);
                        radiusoffset = (float)rules.GetLSLFloatItem(idx++);
                        skew = (float)rules.GetLSLFloatItem(idx++);
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, holesize, topshear,
                                                profilecut, taper_b,
                                                revolutions, radiusoffset, skew, 0);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_TUBE)
                    {
                        if (remain < 11)
                            return;

                        face = rules.GetLSLIntegerItem(idx++); // holeshape
                        v = rules.GetVector3Item(idx++); //cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        holesize = rules.GetVector3Item(idx++);
                        topshear = rules.GetVector3Item(idx++);
                        profilecut = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++); // taper_a
                        revolutions = (float)rules.GetLSLFloatItem(idx++);
                        radiusoffset = (float)rules.GetLSLFloatItem(idx++);
                        skew = (float)rules.GetLSLFloatItem(idx++);
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, holesize, topshear,
                                                profilecut, taper_b,
                                                revolutions, radiusoffset, skew, 1);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_RING)
                    {
                        if (remain < 11)
                            return;

                        face = rules.GetLSLIntegerItem(idx++); // holeshape
                        v = rules.GetVector3Item(idx++); //cut
                        hollow = (float)rules.GetLSLFloatItem(idx++);
                        twist = rules.GetVector3Item(idx++);
                        holesize = rules.GetVector3Item(idx++);
                        topshear = rules.GetVector3Item(idx++);
                        profilecut = rules.GetVector3Item(idx++);
                        taper_b = rules.GetVector3Item(idx++); // taper_a
                        revolutions = (float)rules.GetLSLFloatItem(idx++);
                        radiusoffset = (float)rules.GetLSLFloatItem(idx++);
                        skew = (float)rules.GetLSLFloatItem(idx++);
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), face, v, hollow, twist, holesize, topshear,
                                                profilecut, taper_b,
                                                revolutions, radiusoffset, skew, 3);
                    }

                    else if (code == (int)ScriptBaseClass.PRIM_TYPE_SCULPT)
                    {
                        if (remain < 2)
                            return;

                        string map = rules.Data[idx++].ToString();
                        face = rules.GetLSLIntegerItem(idx++); // type
                        (part as ISceneChildEntity).Shape.PathCurve = (byte)Extrusion.Curve1;
                        SetPrimitiveShapeParams((part as ISceneChildEntity), map, face);
                    }
                }

                else if (code == (int)ScriptBaseClass.PRIM_TEXTURE)
                {
                    if (remain < 5)
                        return;
                    if (part is ISceneChildEntity)
                    {
                    }
                    else
                        return;
                    face = rules.GetLSLIntegerItem(idx++);
                    string tex = rules.Data[idx++].ToString();
                    LSL_Vector repeats = rules.GetVector3Item(idx++);
                    LSL_Vector offsets = rules.GetVector3Item(idx++);
                    double rotation = rules.GetLSLFloatItem(idx++);

                    SetTexture((part as ISceneChildEntity), tex, face);
                    ScaleTexture((part as ISceneChildEntity), repeats.x, repeats.y, face);
                    OffsetTexture((part as ISceneChildEntity), offsets.x, offsets.y, face);
                    RotateTexture((part as ISceneChildEntity), rotation, face);
                }

                else if (code == (int)ScriptBaseClass.PRIM_COLOR)
                {
                    if (remain < 3)
                        return;
                    if (part is ISceneChildEntity)
                    {
                    }
                    else
                        return;
                    face = rules.GetLSLIntegerItem(idx++);
                    LSL_Vector color = rules.GetVector3Item(idx++);
                    double alpha = rules.GetLSLFloatItem(idx++);

                    (part as ISceneChildEntity).SetFaceColor(
                        new Vector3((float)color.x, (float)color.y, (float)color.z), face);
                    SetAlpha((part as ISceneChildEntity), alpha, face);
                }

                else if (code == (int)ScriptBaseClass.PRIM_FLEXIBLE)
                {
                    if (remain < 7)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    bool flexi = rules.GetLSLIntegerItem(idx++);
                    int softness = rules.GetLSLIntegerItem(idx++);
                    float gravity = (float)rules.GetLSLFloatItem(idx++);
                    float friction = (float)rules.GetLSLFloatItem(idx++);
                    float wind = (float)rules.GetLSLFloatItem(idx++);
                    float tension = (float)rules.GetLSLFloatItem(idx++);
                    LSL_Vector force = rules.GetVector3Item(idx++);

                    SetFlexi((part as ISceneChildEntity), flexi, softness, gravity, friction, wind, tension, force);
                }
                else if (code == (int)ScriptBaseClass.PRIM_POINT_LIGHT)
                {
                    if (remain < 5)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    bool light = rules.GetLSLIntegerItem(idx++);
                    LSL_Vector lightcolor = rules.GetVector3Item(idx++);
                    float intensity = (float)rules.GetLSLFloatItem(idx++);
                    float radius = (float)rules.GetLSLFloatItem(idx++);
                    float falloff = (float)rules.GetLSLFloatItem(idx++);

                    SetPointLight((part as ISceneChildEntity), light, lightcolor, intensity, radius, falloff);
                }

                else if (code == (int)ScriptBaseClass.PRIM_GLOW)
                {
                    if (remain < 2)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    face = rules.GetLSLIntegerItem(idx++);
                    float glow = (float)rules.GetLSLFloatItem(idx++);

                    SetGlow((part as ISceneChildEntity), face, glow);
                }
                else if (code == (int)ScriptBaseClass.PRIM_BUMP_SHINY)
                {
                    if (remain < 3)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    face = rules.GetLSLIntegerItem(idx++);
                    int shiny = rules.GetLSLIntegerItem(idx++);
                    Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++));

                    SetShiny(part as ISceneChildEntity, face, shiny, bump);
                }
                else if (code == (int)ScriptBaseClass.PRIM_FULLBRIGHT)
                {
                    if (remain < 2)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    face = rules.GetLSLIntegerItem(idx++);
                    bool st = rules.GetLSLIntegerItem(idx++);
                    SetFullBright(part as ISceneChildEntity, face, st);
                }

                else if (code == (int)ScriptBaseClass.PRIM_MATERIAL)
                {
                    if (remain < 1)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    int mat = rules.GetLSLIntegerItem(idx++);
                    if (mat < 0 || mat > 7)
                        return;

                    (part as ISceneChildEntity).UpdateMaterial(mat);
                }
                else if (code == (int)ScriptBaseClass.PRIM_PHANTOM)
                {
                    if (remain < 1)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    string ph = rules.Data[idx++].ToString();

                    bool phantom = ph.Equals("1");

                    (part as ISceneChildEntity).ScriptSetPhantomStatus(phantom);
                }
                else if (code == (int)ScriptBaseClass.PRIM_PHYSICS)
                {
                    if (remain < 1)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    string phy = rules.Data[idx++].ToString();

                    m_host.ParentEntity.ScriptSetPhysicsStatus(phy.Equals("1"));
                }
                else if (code == (int)ScriptBaseClass.PRIM_TEMP_ON_REZ)
                {
                    if (remain < 1)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    string temp = rules.Data[idx++].ToString();

                    bool tempOnRez = temp.Equals("1");

                    (part as ISceneChildEntity).ScriptSetTemporaryStatus(tempOnRez);
                }
                else if (code == (int)ScriptBaseClass.PRIM_TEXGEN)
                {
                    if (remain < 2)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    //face,type
                    face = rules.GetLSLIntegerItem(idx++);
                    int style = rules.GetLSLIntegerItem(idx++);
                    SetTexGen((part as ISceneChildEntity), face, style);
                }
                else if (code == (int)ScriptBaseClass.PRIM_TEXT)
                {
                    if (remain < 3)
                        return;
                    if (!(part is ISceneChildEntity))
                        return;
                    string primText = rules.GetLSLStringItem(idx++);
                    LSL_Vector primTextColor = rules.GetVector3Item(idx++);
                    LSL_Float primTextAlpha = rules.GetLSLFloatItem(idx++);
                    Vector3 av3 = new Vector3(Util.Clip((float)primTextColor.x, 0.0f, 1.0f),
                                              Util.Clip((float)primTextColor.y, 0.0f, 1.0f),
                                              Util.Clip((float)primTextColor.z, 0.0f, 1.0f));
                    (part as ISceneChildEntity).SetText(primText, av3, Util.Clip((float)primTextAlpha, 0.0f, 1.0f));
                }
                else if (code == (int)ScriptBaseClass.PRIM_OMEGA)
                {
                    if (remain < 3)
                        return;
                    LSL_Vector direction = rules.GetVector3Item(idx++);
                    LSL_Float spinrate = rules.GetLSLFloatItem(idx++);
                    LSL_Float gain = rules.GetLSLFloatItem(idx++);
                    if (part is ISceneChildEntity)
                        llTargetOmega(direction, spinrate, gain);
                }
                else if (code == (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE)
                {
                    bool UsePhysics = ((m_host.Flags & PrimFlags.Physics) != 0);
                    bool IsTemporary = ((m_host.Flags & PrimFlags.TemporaryOnRez) != 0);
                    bool IsPhantom = ((m_host.Flags & PrimFlags.Phantom) != 0);
                    bool IsVolumeDetect = m_host.VolumeDetectActive;
                    ObjectFlagUpdatePacket.ExtraPhysicsBlock[] blocks = new ObjectFlagUpdatePacket.ExtraPhysicsBlock[1];
                    blocks[0] = new ObjectFlagUpdatePacket.ExtraPhysicsBlock
                                    {
                                        Density = m_host.Density,
                                        Friction = m_host.Friction,
                                        GravityMultiplier = m_host.GravityMultiplier
                                    };
                    LSL_Integer shapeType = rules.GetLSLIntegerItem(idx++);
                    if (shapeType == ScriptBaseClass.PRIM_PHYSICS_SHAPE_PRIM)
                        blocks[0].PhysicsShapeType = (byte)shapeType.value;
                    else if (shapeType == ScriptBaseClass.PRIM_PHYSICS_SHAPE_NONE)
                        blocks[0].PhysicsShapeType = (byte)shapeType.value;
                    else //if(shapeType == ScriptBaseClass.PRIM_PHYSICS_SHAPE_CONVEX)
                        blocks[0].PhysicsShapeType = (byte)shapeType.value;
                    blocks[0].Restitution = m_host.Restitution;
                    if (part is ISceneChildEntity)
                        if ((part as ISceneChildEntity).UpdatePrimFlags(UsePhysics,
                                                                        IsTemporary, IsPhantom, IsVolumeDetect, blocks))
                            (part as ISceneChildEntity).ParentEntity.RebuildPhysicalRepresentation(true, null);
                }
                else if (code == (int)ScriptBaseClass.PRIM_LINK_TARGET)
                {
                    if (remain < 1)
                        return;
                    LSL_Integer nextLink = rules.GetLSLIntegerItem(idx++);
                    List<IEntity> entities = GetLinkPartsAndEntities(nextLink);
                    if (entities.Count > 0)
                        part = entities[0];
                }
                else if (code == (int)ScriptBaseClass.OS_PRIM_PROJECTION)
                {
                    if (remain < 5 || !allowOpenSimParams)
                        return;
                    bool projection = rules.GetLSLIntegerItem(idx++) != 0;
                    string texture = rules.GetLSLStringItem(idx++);
                    UUID textureKey;
                    UUID.TryParse(texture, out textureKey);
                    float fov = (float)rules.GetLSLFloatItem(idx++);
                    float focus = (float)rules.GetLSLFloatItem(idx++);
                    float ambiance =
                            (float)rules.GetLSLFloatItem(idx++);

                    if (part is ISceneChildEntity)
                    {
                        (part as ISceneChildEntity).Shape.ProjectionEntry = projection;
                        (part as ISceneChildEntity).Shape.ProjectionTextureUUID = textureKey;
                        (part as ISceneChildEntity).Shape.ProjectionFOV = fov;
                        (part as ISceneChildEntity).Shape.ProjectionFocus = focus;
                        (part as ISceneChildEntity).Shape.ProjectionAmbiance = ambiance;

                        (part as ISceneChildEntity).ScheduleUpdate(PrimUpdateFlags.FullUpdate);
                    }
                }
                else if (code == (int)ScriptBaseClass.OS_PRIM_VELOCITY)
                {
                    if (remain < 1 || !allowOpenSimParams)
                        return;
                    LSL_Vector velocity = rules.GetVector3Item(idx++);
                    (part as ISceneChildEntity).Velocity = velocity.ToVector3();
                    (part as ISceneChildEntity).ScheduleTerseUpdate();
                }
                else if (code == (int)ScriptBaseClass.OS_PRIM_ACCELERATION)
                {
                    if (remain < 1 || !allowOpenSimParams)
                        return;
                    LSL_Vector accel = rules.GetVector3Item(idx++);
                    (part as ISceneChildEntity).Acceleration = accel.ToVector3();
                    (part as ISceneChildEntity).ScheduleTerseUpdate();
                }
            }
        }
Ejemplo n.º 29
0
        public LSL_Integer aaWindlightSetScene(int dayCycleIndex, LSL_List list)
        {
            IEnvironmentSettingsModule environmentSettings = World.RequestModuleInterface<IEnvironmentSettingsModule>();
            if (environmentSettings == null)
                return ScriptBaseClass.WL_ERROR_NO_SCENE_SET;
            WindlightDayCycle cycle = environmentSettings.GetCurrentDayCycle();
            if (cycle == null)
                return ScriptBaseClass.WL_ERROR_NO_SCENE_SET;
            if (!cycle.Cycle.IsStaticDayCycle)
                return ScriptBaseClass.WL_ERROR_SCENE_MUST_BE_STATIC;
            if (dayCycleIndex >= cycle.Cycle.DataSettings.Count)
                return ScriptBaseClass.WL_ERROR_BAD_SETTING;

            ConvertLSLToWindlight(ref cycle, dayCycleIndex, list);
            environmentSettings.SetDayCycle(cycle);
            environmentSettings.TriggerWindlightUpdate(1);

            return ScriptBaseClass.WL_OK;
        }
Ejemplo n.º 30
0
        public LSL_List llGetAnimationList(string id)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
                return new LSL_List();


            LSL_List l = new LSL_List();
            IScenePresence av = World.GetScenePresence((UUID)id);
            if (av == null || av.IsChildAgent) // only if in the region
                return l;
            UUID[] anims = av.Animator.GetAnimationArray();
            foreach (UUID foo in anims)
                l.Add(new LSL_Key(foo.ToString()));
            return l;
        }
Ejemplo n.º 31
0
        public void botSetMap(string keyOfBot, LSL_List positions, LSL_List movementType, LSL_Integer flags)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.Moderate, "botSetMap", m_host, "bot", m_itemID)) return;
            List<Vector3> PositionsMap = new List<Vector3>();
            for (int i = 0; i < positions.Length; i++)
            {
                LSL_Vector pos = positions.GetVector3Item(i);
                PositionsMap.Add(new Vector3((float) pos.x, (float) pos.y, (float) pos.z));
            }
            List<TravelMode> TravelMap = new List<TravelMode>();
            for (int i = 0; i < movementType.Length; i++)
            {
                LSL_Integer travel = movementType.GetLSLIntegerItem(i);
                TravelMap.Add((TravelMode) travel.value);
            }

            IBotManager manager = World.RequestModuleInterface<IBotManager>();
            if (manager != null)
                manager.SetBotMap(UUID.Parse(keyOfBot), PositionsMap, TravelMap, flags.value, m_host.OwnerID);
        }
Ejemplo n.º 32
0
        /// <summary>
        ///     A partial implementation.
        ///     http://lslwiki.net/lslwiki/wakka.php?wakka=llGetBoundingBox
        ///     So far only valid for standing/flying/ground sitting avatars and single prim objects.
        ///     If the object has multiple prims and/or a sitting avatar then the bounding
        ///     box is for the root prim only.
        /// </summary>
        public LSL_List llGetBoundingBox(string obj)
        {
            if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID))
                return new LSL_List();

            UUID objID = UUID.Zero;
            LSL_List result = new LSL_List();
            if (!UUID.TryParse(obj, out objID))
            {
                result.Add(new LSL_Vector());
                result.Add(new LSL_Vector());
                return result;
            }
            IScenePresence presence = World.GetScenePresence(objID);
            if (presence != null)
            {
                if (presence.ParentID == UUID.Zero) // not sat on an object
                {
                    LSL_Vector lower = new LSL_Vector();
                    LSL_Vector upper = new LSL_Vector();
                    if (presence.Animator.Animations.ImplicitDefaultAnimation.AnimID
                        == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
                    {
                        // This is for ground sitting avatars
                        IAvatarAppearanceModule appearance = presence.RequestModuleInterface<IAvatarAppearanceModule>();
                        if (appearance != null)
                        {
                            float height = appearance.Appearance.AvatarHeight / 2.66666667f;
                            lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
                            upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
                        }
                    }
                    else
                    {
                        // This is for standing/flying avatars
                        IAvatarAppearanceModule appearance = presence.RequestModuleInterface<IAvatarAppearanceModule>();
                        if (appearance != null)
                        {
                            float height = appearance.Appearance.AvatarHeight / 2.0f;
                            lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
                            upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
                        }
                    }
                    result.Add(lower);
                    result.Add(upper);
                    return result;
                }
                // sitting on an object so we need the bounding box of that
                // which should include the avatar so set the UUID to the
                // UUID of the object the avatar is sat on and allow it to fall through
                // to processing an object
                ISceneChildEntity p = World.GetSceneObjectPart(presence.ParentID);
                objID = p.UUID;
            }
            ISceneChildEntity part = World.GetSceneObjectPart(objID);
            // Currently only works for single prims without a sitting avatar
            if (part != null)
            {
                Vector3 halfSize = part.Scale * 0.5f;
                LSL_Vector lower = new LSL_Vector(halfSize.X * -1.0f, halfSize.Y * -1.0f, halfSize.Z * -1.0f);
                LSL_Vector upper = new LSL_Vector(halfSize.X, halfSize.Y, halfSize.Z);
                result.Add(lower);
                result.Add(upper);
                return result;
            }

            // Not found so return empty values
            result.Add(new LSL_Vector());
            result.Add(new LSL_Vector());
            return result;
        }