Beispiel #1
0
        private void RezActualScript(AgentCircuit circuit, ObjectPart part, RezScript req, AssetData data)
        {
            if (!part.CheckPermissions(Owner, Group, InventoryPermissionsMask.Modify))
            {
                var res = new AlertMessage
                {
                    Message = "ALERT: NoPermModifyObject"
                };
                circuit.SendMessage(res);
                return;
            }
            var item = new ObjectPartInventoryItem
            {
                Name           = req.InventoryBlock.Name,
                AssetID        = data.ID,
                Description    = req.InventoryBlock.Description,
                AssetType      = AssetType.LSLText,
                Creator        = Owner,
                Owner          = Owner,
                Flags          = 0,
                Group          = Group,
                IsGroupOwned   = false,
                InventoryType  = InventoryType.LSL,
                LastOwner      = Owner,
                ParentFolderID = part.ID
            };

            item.Permissions.Base      = req.InventoryBlock.BaseMask;
            item.Permissions.Current   = req.InventoryBlock.OwnerMask;
            item.Permissions.EveryOne  = req.InventoryBlock.EveryoneMask;
            item.Permissions.Group     = req.InventoryBlock.GroupMask;
            item.Permissions.NextOwner = req.InventoryBlock.NextOwnerMask;
            item.SaleInfo.Price        = req.InventoryBlock.SalePrice;
            item.SaleInfo.Type         = req.InventoryBlock.SaleType;

            part.Inventory.Add(item);
            part.SendObjectUpdate();

            ScriptInstance instance;

            try
            {
                SceneInterface scene = part.ObjectGroup.Scene;
                instance            = ScriptLoader.Load(part, item, item.Owner, data, CurrentCulture, openInclude: part.OpenScriptInclude);
                item.ScriptInstance = instance;
                item.ScriptInstance.IsRunningAllowed = scene.CanRunScript(item.Owner, part.ObjectGroup.GlobalPosition, item.AssetID);
                item.ScriptInstance.IsRunning        = true;
                item.ScriptInstance.Reset();
                part.ObjectGroup.Scene.SendObjectPropertiesToAgent(this, part);
            }
            catch
            {
                var res = new AlertMessage
                {
                    Message = this.GetLanguageString(circuit.Agent.CurrentCulture, "CouldNotCompileScript", "Could not compile script")
                };
                circuit.SendMessage(res);
                return;
            }
        }
            public override void Write(string text)
            {
                var res = new SimConsoleResponse
                {
                    Message = text
                };

                m_Circuit.SendMessage(res);
                HaveOutputSent = true;
            }
Beispiel #3
0
        private void EstateOwner_Terrain(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 1)
            {
                return;
            }
            SceneInterface scene = circuit.Scene;

            if (scene == null)
            {
                return;
            }
            switch (req.ParamList[0].FromUTF8Bytes())
            {
            case "download filename":
                if (req.ParamList.Count > 1)
                {
                    string viewerFilename = req.ParamList[1].FromUTF8Bytes();

                    AddNewFile("terrain.raw", LLRAWData.ToLLRaw(scene.Terrain.AllPatches));
                    circuit.SendMessage(new InitiateDownload
                    {
                        AgentID        = ID,
                        SimFilename    = "terrain.raw",
                        ViewerFilename = viewerFilename
                    });
                }
                break;

            case "upload filename":
                if (req.ParamList.Count > 1)
                {
                    var t = new TerrainUploadTransaction(circuit.Scene)
                    {
                        Filename = req.ParamList[1].FromUTF8Bytes()
                    };
                    AddTerrainUploadTransaction(t, req.CircuitSceneID);
                }
                break;

            default:
                break;
            }
        }
Beispiel #4
0
        private void RezNewScript(AgentCircuit circuit, ObjectPart part, RezScript req)
        {
            AssetData data;

            try
            {
                /* this is the KAN-Ed llSay script */
                data = circuit.Scene.AssetService["366ac8e9-b391-11dc-8314-0800200c9a66"];
            }
            catch
            {
                var res = new AlertMessage
                {
                    Message = "ALERT: ScriptMissing"
                };
                circuit.SendMessage(res);
                return;
            }

            RezActualScript(circuit, part, req, data);
        }
        private void SendAgentDataUpdate(AgentCircuit circuit)
        {
            var adu           = new AgentDataUpdate();
            var groupsService = circuit.Scene.GroupsService;

            if (groupsService != null)
            {
                try
                {
                    GroupRole             gr;
                    GroupActiveMembership gm;
                    if (groupsService.ActiveMembership.TryGetValue(Owner, Owner, out gm))
                    {
                        adu.ActiveGroupID = groupsService.ActiveGroup[Owner, Owner].ID;
                        if (adu.ActiveGroupID != UUID.Zero)
                        {
                            gr              = groupsService.Roles[Owner, gm.Group, gm.SelectedRoleID];
                            adu.GroupName   = gm.Group.GroupName;
                            adu.GroupTitle  = gr.Title;
                            adu.GroupPowers = gr.Powers;
                        }
                    }
                }
                catch
#if DEBUG
                (Exception e)
#endif
                {
                    /* only needed for debugging purposes to show. Otherwise, it gets pretty spammy during normal operation */
#if DEBUG
                    m_Log.Debug("HandleAgentDataUpdateRequest", e);
#endif
                }
            }
            adu.AgentID   = ID;
            adu.FirstName = FirstName;
            adu.LastName  = LastName;
            circuit.SendMessage(adu);
        }
        private void ProcessTopColliders(AgentCircuit circuit, SceneInterface scene, LandStatFilterFlags flags, string filter)
        {
            Dictionary <uint, double> colliderScores = scene.PhysicsScene.GetTopColliders();
            var reply = new LandStatReply
            {
                ReportType       = LandStatReportEnum.TopColliders,
                RequestFlags     = 0,
                TotalObjectCount = (uint)colliderScores.Count
            };

            int allocedlength = 0;

            /* make top objects go first */
            foreach (KeyValuePair <uint, double> kvp in colliderScores.OrderByDescending(x => x.Value))
            {
                if (reply.ReportData.Count == 100)
                {
                    break;
                }
                ObjectPart p;
                try
                {
                    if (!scene.Primitives.TryGetValue(kvp.Key, out p))
                    {
                        continue;
                    }

                    UGUIWithName owner = scene.AvatarNameService.ResolveName(p.Owner);

                    if ((flags & LandStatFilterFlags.FilterByObject) != 0 && !p.Name.Contains(filter))
                    {
                        continue;
                    }

                    if ((flags & LandStatFilterFlags.FilterByOwner) != 0 && !owner.FullName.Contains(filter))
                    {
                        continue;
                    }

                    ParcelInfo pinfo;
                    if ((flags & LandStatFilterFlags.FilterByParcelName) != 0 && !scene.Parcels.TryGetValue(p.GlobalPosition, out pinfo) && !pinfo.Name.Equals(filter, System.StringComparison.InvariantCultureIgnoreCase))
                    {
                        continue;
                    }

                    var entry = new LandStatReply.ReportDataEntry
                    {
                        Location    = p.GlobalPosition,
                        Score       = kvp.Value,
                        TaskID      = p.ID,
                        TaskLocalID = kvp.Key,
                        TaskName    = p.Name,
                        OwnerName   = owner.FullName
                    };

                    if (allocedlength + entry.MessageLength > 1400)
                    {
                        circuit.SendMessage(reply);
                        reply = new LandStatReply
                        {
                            ReportType       = LandStatReportEnum.TopColliders,
                            RequestFlags     = 0,
                            TotalObjectCount = (uint)colliderScores.Count
                        };
                    }

                    reply.ReportData.Add(entry);
                    allocedlength += entry.MessageLength;
                }
                catch
                {
                    /* ignore the report */
                }
            }
            circuit.SendMessage(reply);
        }
Beispiel #7
0
        private void RezScriptFromAgentInventory(AgentCircuit circuit, ObjectPart part, RezScript req)
        {
            var           itemID = req.InventoryBlock.ItemID;
            InventoryItem item;

            try
            {
                item = InventoryService.Item[Owner.ID, itemID];
            }
            catch
            {
                var res = new AlertMessage
                {
                    Message = "ALERT: ScriptMissing"
                };
                circuit.SendMessage(res);
                return;
            }

            if (item.AssetType == AssetType.Link)
            {
                try
                {
                    item = InventoryService.Item[Owner.ID, item.AssetID];
                }
                catch
                {
                    var res = new AlertMessage
                    {
                        Message = "ALERT: ScriptMissing"
                    };
                    circuit.SendMessage(res);
                    return;
                }
            }

            if (item.AssetType != AssetType.LSLText)
            {
                var res = new AlertMessage
                {
                    Message = "Unable to rez a non-script asset as script"
                };
                circuit.SendMessage(res);
                return;
            }

            AssetData data;

            /* Fetch asset locally first. It can prevent a lengthy request on foreign services. */
            try
            {
                data = circuit.Scene.AssetService[item.AssetID];
            }
            catch
            {
                /* Fetch asset from agent */
                try
                {
                    data = AssetService[item.AssetID];
                }
                catch
                {
                    var res = new AlertMessage
                    {
                        Message = "ALERT: ScriptMissing"
                    };
                    circuit.SendMessage(res);
                    return;
                }

                /* Do not trust foreign sources for correct flags */
                data.Temporary = false;
                data.Local     = false;

                /* Save asset locally */
                try
                {
                    circuit.Scene.AssetService.Store(data);
                }
                catch
                {
                    var res = new AlertMessage
                    {
                        Message = "ALERT: UnableToLoadScript"
                    };
                    circuit.SendMessage(res);
                    return;
                }
            }

            if (data.Type != AssetType.LSLText)
            {
                var res = new AlertMessage
                {
                    Message = this.GetLanguageString(CurrentCulture, "UnableToRezANonScriptAsScript", "Unable to rez a non-script asset as script")
                };
                circuit.SendMessage(res);
                return;
            }

            RezActualScript(circuit, part, req, data);

            if (0 == (item.Permissions.Current & InventoryPermissionsMask.Copy))
            {
                InventoryService.Item.Delete(Owner.ID, itemID);
            }
        }