Пример #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;
            }
        }
Пример #2
0
        private bool VerifyEndpointAddress(AgentCircuit circ, EndPoint newEp)
        {
            if (circ.RemoteEndPoint.AddressFamily != newEp.AddressFamily)
            {
                return(false);
            }

            if (circ.RemoteEndPoint.AddressFamily == AddressFamily.InterNetwork ||
                circ.RemoteEndPoint.AddressFamily == AddressFamily.InterNetworkV6)
            {
                var ep1 = circ.RemoteEndPoint as IPEndPoint;
                var ep2 = newEp as IPEndPoint;
                if (ep1 == null || ep2 == null)
                {
                    return(false);
                }
                return(ep1.Address.Equals(ep2.Address));
            }

            foreach (var service in m_PortControlServices)
            {
                if (service.CheckIfMappedAddress(newEp, circ.RemoteEndPoint))
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #3
0
        private void EstateOwner_SetRegionInfo(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 9)
            {
                return;
            }

            var scene = circuit.Scene;

            scene.RegionSettings.BlockTerraform  = ParamStringToBool(req.ParamList[0]);
            scene.RegionSettings.BlockFly        = ParamStringToBool(req.ParamList[1]);
            scene.RegionSettings.AllowDamage     = ParamStringToBool(req.ParamList[2]);
            scene.RegionSettings.AllowLandResell = ParamStringToBool(req.ParamList[3]);
            scene.RegionSettings.AgentLimit      = (int)decimal.Parse(req.ParamList[4].FromUTF8Bytes(), CultureInfo.InvariantCulture);
            scene.RegionSettings.ObjectBonus     = float.Parse(req.ParamList[5].FromUTF8Bytes(), CultureInfo.InvariantCulture);
            scene.Access = (RegionAccess)int.Parse(req.ParamList[6].FromUTF8Bytes());
            scene.RegionSettings.RestrictPushing     = ParamStringToBool(req.ParamList[7]);
            scene.RegionSettings.AllowLandJoinDivide = ParamStringToBool(req.ParamList[8]);
#if DEBUG
            m_Log.DebugFormat("RegionFlags={0} Access={1} AgentLimit={2} ObjectBonus={3}",
                              scene.RegionSettings.AsFlags.ToString(),
                              scene.Access,
                              scene.RegionSettings.AgentLimit,
                              scene.RegionSettings.ObjectBonus);
#endif

            scene.ReregisterRegion();
            scene.TriggerRegionSettingsChanged();
        }
Пример #4
0
        private void EstateOwner_InstantMessage(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 2)
            {
                return;
            }

            var message = (req.ParamList.Count < 5 ?
                           req.ParamList[1] :
                           req.ParamList[4]).FromUTF8Bytes();

            var  scene         = circuit.Scene;
            var  thisRegionId  = scene.ID;
            var  estateService = scene.EstateService;
            uint estateId;

            if (estateService.RegionMap.TryGetValue(thisRegionId, out estateId))
            {
                foreach (var regionId in estateService.RegionMap[estateId])
                {
                    if (m_Scenes.TryGetValue(regionId, out scene))
                    {
                        foreach (var agent in scene.RootAgents)
                        {
                            agent.SendAlertMessage(message, regionId);
                        }
                    }
                }
            }
        }
        private void EstateOwner_Colliders(AgentCircuit circuit, EstateOwnerMessage req)
        {
            SceneInterface scene = circuit.Scene;

            if (scene == null)
            {
                return;
            }

            ProcessTopColliders(circuit, scene, LandStatFilterFlags.None, string.Empty);
        }
Пример #6
0
        public void HandleIM(ViewerAgent nop, AgentCircuit circuit, Message m)
        {
            var im = (GridInstantMessage)(ImprovedInstantMessage)m;

            im.IsFromGroup  = false;
            im.FromAgent.ID = ID;

            im.OnResult = circuit.OnIMResult;

            var server = circuit.Server;

            server?.RouteIM(im);
        }
Пример #7
0
        private void EstateOwner_SetRegionDebug(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 3)
            {
                return;
            }
            var scene = circuit.Scene;

            scene.RegionSettings.DisableScripts    = ParamStringToBool(req.ParamList[0]);
            scene.RegionSettings.DisableCollisions = ParamStringToBool(req.ParamList[1]);
            scene.RegionSettings.DisablePhysics    = ParamStringToBool(req.ParamList[2]);
            scene.TriggerRegionSettingsChanged();
        }
Пример #8
0
        private void EstateOwner_EstateChangeInfo(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 3)
            {
                return;
            }
            var    scene      = circuit.Scene;
            var    param1     = (RegionOptionFlags)uint.Parse(req.ParamList[1].FromUTF8Bytes());
            uint   param2     = uint.Parse(req.ParamList[2].FromUTF8Bytes());
            string estateName = req.ParamList[0].FromUTF8Bytes();

#if DEBUG
            m_Log.DebugFormat("Changing Estate Info: Name={0}, Flags={1}, SunPos={2}",
                              estateName, param1.ToString(), param2);
#endif

            EstateInfo estate;
            var        estateService = scene.EstateService;
            uint       estateID;
            if (estateService.RegionMap.TryGetValue(circuit.Scene.ID, out estateID) &&
                estateService.TryGetValue(estateID, out estate))
            {
                if (param2 != 0)
                {
                    estate.UseGlobalTime = false;
                    estate.SunPosition   = (param2 / 1024.0 - 6).Clamp(0, 24);
                }
                else
                {
                    estate.UseGlobalTime = true;
                }

                if (estateName.Length != 0)
                {
                    estate.Name = estateName;
                }
                estate.Flags = param1;
                estateService.Update(estate);

                SendEstateUpdateInfo(req.Invoice, req.TransactionID, estate, scene.ID);
                foreach (var regionID in estateService.RegionMap[estateID])
                {
                    SceneInterface estateScene;
                    if (m_Scenes.TryGetValue(regionID, out estateScene))
                    {
                        estateScene.TriggerEstateUpdate();
                    }
                }
            }
        }
Пример #9
0
        private void EstateOwner_SimulatorMessage(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 5)
            {
                return;
            }

            var message = req.ParamList[4].FromUTF8Bytes();

            foreach (var agent in circuit.Scene.Agents)
            {
                agent.SendRegionNotice(Owner, message, req.CircuitSceneID);
            }
        }
Пример #10
0
        private void EstateOwner_EstateChangeCovenantId(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 1)
            {
                return;
            }

            var        covenantID = UUID.Parse(req.ParamList[0].FromUTF8Bytes());
            EstateInfo estate;
            uint       estateID;
            var        estateService = circuit.Scene.EstateService;

            if (covenantID != UUID.Zero)
            {
                AssetData data;
                if (!circuit.Scene.AssetService.TryGetValue(covenantID, out data))
                {
                    if (circuit.Agent.AssetService.TryGetValue(covenantID, out data))
                    {
                        circuit.Scene.AssetService.Store(data);
                    }
                    else
                    {
                        return;
                    }
                }
                if (data.Type != AssetType.Notecard)
                {
                    /* do not allow to set anything else than a notecard here */
                    return;
                }
            }

            if (estateService.RegionMap.TryGetValue(circuit.Scene.ID, out estateID) &&
                estateService.TryGetValue(estateID, out estate))
            {
                estate.CovenantID        = covenantID;
                estate.CovenantTimestamp = Date.Now;
                estateService.Update(estate);
                foreach (var regionID in estateService.RegionMap[estateID])
                {
                    SceneInterface estateScene;
                    if (m_Scenes.TryGetValue(regionID, out estateScene))
                    {
                        estateScene.TriggerEstateUpdate();
                    }
                }
            }
        }
Пример #11
0
        private void EstateOwner_Restart(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 1)
            {
                return;
            }

            float timeToRestart;

            if (!float.TryParse(req.ParamList[0].FromUTF8Bytes(), NumberStyles.Any, CultureInfo.InvariantCulture, out timeToRestart))
            {
                timeToRestart = 120;
            }
            circuit.Scene.RequestRegionRestart((int)timeToRestart);
        }
Пример #12
0
        private void EstateOwner_TeleportHomeAllUsers(AgentCircuit circuit, EstateOwnerMessage req)
        {
            var scene = circuit.Scene;

            foreach (var targetagent in scene.RootAgents)
            {
                if (targetagent == circuit.Agent)
                {
                    /* do not do self-kick */
                }
                else if (!targetagent.TeleportHome(scene))
                {
                    targetagent.KickUser(this.GetLanguageString(circuit.Agent.CurrentCulture, "YouHaveBeenKickedSinceYouCouldNotBeTeleportedHome", "You have been kicked since you could not be teleported home."));
                }
            }
        }
Пример #13
0
        private void EstateOwner_TextureHeights(AgentCircuit circuit, EstateOwnerMessage req)
        {
            var scene = circuit.Scene;

            foreach (byte[] b in req.ParamList)
            {
                string   s          = b.FromUTF8Bytes();
                string[] splitfield = s.Split(' ');
                if (splitfield.Length != 3)
                {
                    continue;
                }

                var corner    = Int16.Parse(splitfield[0]);
                var lowValue  = float.Parse(splitfield[1], CultureInfo.InvariantCulture);
                var highValue = float.Parse(splitfield[2], CultureInfo.InvariantCulture);

                switch (corner)
                {
                case 0:
                    scene.RegionSettings.Elevation1SW = lowValue;
                    scene.RegionSettings.Elevation2SW = highValue;
                    break;

                case 1:
                    scene.RegionSettings.Elevation1NW = lowValue;
                    scene.RegionSettings.Elevation2NW = highValue;
                    break;

                case 2:
                    scene.RegionSettings.Elevation1SE = lowValue;
                    scene.RegionSettings.Elevation2SE = highValue;
                    break;

                case 3:
                    scene.RegionSettings.Elevation1NE = lowValue;
                    scene.RegionSettings.Elevation2NE = highValue;
                    break;

                default:
                    break;
                }
            }

            scene.TriggerRegionSettingsChanged();
        }
Пример #14
0
        private void EstateOwner_KickEstate(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 1)
            {
                return;
            }

            var prey = UUID.Parse(req.ParamList[0].FromUTF8Bytes());

            IAgent targetagent;
            var    scene = circuit.Scene;

            if (scene.RootAgents.TryGetValue(prey, out targetagent))
            {
                targetagent.KickUser(this.GetLanguageString(targetagent.CurrentCulture, "YouHaveBeenKicked", "You have been kicked."));
            }
        }
Пример #15
0
        private void EstateOwner_TeleportHomeUser(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 2)
            {
                return;
            }
            var prey = UUID.Parse(req.ParamList[1].FromUTF8Bytes());

            var scene = circuit.Scene;

            IAgent targetagent;

            if (scene.RootAgents.TryGetValue(prey, out targetagent) &&
                !targetagent.TeleportHome(scene))
            {
                targetagent.KickUser(this.GetLanguageString(circuit.Agent.CurrentCulture, "YouHaveBeenKickedSinceYouCouldNotBeTeleportedHome", "You have been kicked since you could not be teleported home."));
            }
        }
Пример #16
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;
            }
        }
Пример #17
0
        private void EstateOwner_GetInfo(AgentCircuit circuit, EstateOwnerMessage req)
        {
            var        scene = circuit.Scene;
            uint       estateID;
            EstateInfo estateInfo;

            if (!scene.EstateService.RegionMap.TryGetValue(scene.ID, out estateID) ||
                !scene.EstateService.TryGetValue(estateID, out estateInfo))
            {
                return;
            }

            SendEstateList(
                req.TransactionID,
                req.Invoice,
                EstateAccessFlags.Managers,
                scene.EstateService.EstateManager.All[estateID],
                estateID,
                req.CircuitSceneID);
            SendEstateList(
                req.TransactionID,
                req.Invoice,
                EstateAccessFlags.AllowedAgents,
                scene.EstateService.EstateAccess.All[estateID],
                estateID,
                req.CircuitSceneID);
            SendEstateList(
                req.TransactionID,
                req.Invoice,
                scene.EstateService.EstateGroup.All[estateID],
                estateID,
                req.CircuitSceneID);
            SendEstateList(
                req.TransactionID,
                req.Invoice,
                EstateAccessFlags.BannedAgents,
                scene.EstateService.EstateBans.All[estateID],
                estateID,
                req.CircuitSceneID);

            SendEstateUpdateInfo(req.Invoice, req.TransactionID, estateInfo, req.CircuitSceneID);
        }
Пример #18
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);
        }
Пример #19
0
        private void EstateOwner_SetRegionTerrain(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count != 9)
            {
                return;
            }

            var scene = circuit.Scene;

            scene.RegionSettings.WaterHeight       = float.Parse(req.ParamList[0].FromUTF8Bytes(), CultureInfo.InvariantCulture);
            scene.RegionSettings.TerrainRaiseLimit = float.Parse(req.ParamList[1].FromUTF8Bytes(), CultureInfo.InvariantCulture);
            scene.RegionSettings.TerrainLowerLimit = float.Parse(req.ParamList[2].FromUTF8Bytes(), CultureInfo.InvariantCulture);

            scene.RegionSettings.IsSunFixed   = ParamStringToBool(req.ParamList[4]);
            scene.RegionSettings.SunPosition  = (double.Parse(req.ParamList[5].FromUTF8Bytes(), CultureInfo.InvariantCulture) - 6).Clamp(0, 24);
            scene.RegionSettings.UseEstateSun = ParamStringToBool(req.ParamList[3]);
            /* 6 is bool estate use global time */
            /* 7 is bool for IsEstateFixedSun */
            /* 8 estate sun_hour */

            scene.TriggerRegionSettingsChanged();
        }
Пример #20
0
        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);
        }
Пример #21
0
        private void EstateOwner_EstateExperienceDelta(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 3)
            {
                return;
            }

            var  flags        = (EstateExperienceDeltaFlags)int.Parse(req.ParamList[1].FromUTF8Bytes());
            UUID experienceid = UUID.Parse(req.ParamList[2].FromUTF8Bytes());

            SceneInterface scene = circuit.Scene;
            UEI            experienceID;
            bool           isExpfromAgent = false;

            if (scene.ExperienceNameService != null && scene.ExperienceNameService.TryGetValue(experienceid, out experienceID))
            {
            }
            else if (ExperienceService != null && ExperienceService.TryGetValue(experienceid, out experienceID))
            {
                isExpfromAgent = true;
                scene.ExperienceNameService?.Store(experienceID);
            }
            else if (scene.ExperienceService != null && scene.ExperienceService.TryGetValue(experienceid, out experienceID))
            {
            }
            else
            {
                circuit.Agent.SendAlertMessage(this.GetLanguageString(circuit.Agent.CurrentCulture, "ChangingEstateExperienceNotPossibleSinceExperienceNotKnown", "Changing estate experience not possible since experience not known"), scene.ID);
                return;
            }

            EstateInfo estate;
            uint       estateID;
            var        allEstateIds  = new List <uint>();
            var        estateService = circuit.Scene.EstateService;

            if (estateService.RegionMap.TryGetValue(circuit.Scene.ID, out estateID) &&
                estateService.TryGetValue(estateID, out estate))
            {
                if ((flags & EstateExperienceDeltaFlags.AllEstates) != 0)
                {
                    allEstateIds = estateService.EstateOwner[estate.Owner];
                }
                else
                {
                    allEstateIds.Add(estateID);
                }
            }

            if (allEstateIds.Count == 0)
            {
                circuit.Agent.SendAlertMessage(this.GetLanguageString(circuit.Agent.CurrentCulture, "ChangingEstateExperienceNotPossibleSinceNoEstateFound", "Changing estate experience not possible since no estate found"), scene.ID);
                return;
            }

            foreach (var selectedEstateId in allEstateIds)
            {
                if ((flags & EstateExperienceDeltaFlags.AddAllowed) != 0)
                {
                    estateService.Experiences.Store(new EstateExperienceInfo {
                        EstateID = selectedEstateId, ExperienceID = experienceID, IsAllowed = true
                    });
                }
                if ((flags & EstateExperienceDeltaFlags.RemoveAllowed) != 0)
                {
                    estateService.Experiences.Remove(selectedEstateId, experienceID);
                }
                if ((flags & EstateExperienceDeltaFlags.AddBlocked) != 0)
                {
                    estateService.Experiences.Store(new EstateExperienceInfo {
                        EstateID = selectedEstateId, ExperienceID = experienceID, IsAllowed = false
                    });
                }
                if ((flags & EstateExperienceDeltaFlags.RemoveBlocked) != 0)
                {
                    estateService.Experiences.Remove(selectedEstateId, experienceID);
                }
                if ((flags & EstateExperienceDeltaFlags.AddTrusted) != 0)
                {
                    estateService.TrustedExperiences[selectedEstateId, experienceID] = true;
                }
                if ((flags & EstateExperienceDeltaFlags.RemoveTrusted) != 0)
                {
                    estateService.TrustedExperiences.Remove(selectedEstateId, experienceID);
                }
            }

            var m = new EstateOwnerMessage
            {
                TransactionID = req.TransactionID,
                Invoice       = req.Invoice,
                AgentID       = Owner.ID,
                SessionID     = SessionID,
                Method        = "setexperience"
            };

            m.ParamList.Add(StringToBytes(estateID.ToString()));
            m.ParamList.Add(StringToBytes("1"));

            var allowed = new List <UEI>();
            var blocked = new List <UEI>();

            foreach (EstateExperienceInfo info in estateService.Experiences[scene.ParentEstateID])
            {
                if (info.IsAllowed)
                {
                    allowed.Add(info.ExperienceID);
                }
                else
                {
                    blocked.Add(info.ExperienceID);
                }
            }
            List <UEI> trusted = estateService.TrustedExperiences[scene.ParentEstateID];

            m.ParamList.Add(StringToBytes(blocked.Count.ToString()));
            m.ParamList.Add(StringToBytes(trusted.Count.ToString()));
            m.ParamList.Add(StringToBytes(allowed.Count.ToString()));
            foreach (UEI id in blocked)
            {
                m.ParamList.Add(id.ID.GetBytes());
            }
            foreach (UEI id in trusted)
            {
                m.ParamList.Add(id.ID.GetBytes());
            }
            foreach (UEI id in allowed)
            {
                m.ParamList.Add(id.ID.GetBytes());
            }
            SendMessageAlways(m, req.CircuitSceneID);
        }
Пример #22
0
        private void HandleChildAgentChanges(AgentCircuit circuit)
        {
            SceneInterface scene = circuit.Scene;

            if (scene == null)
            {
                return;
            }

            Dictionary <GridVector, IChildAgentConnection> disconnects = new Dictionary <GridVector, IChildAgentConnection>();

            foreach (KeyValuePair <GridVector, IChildAgentConnection> kvp in KnownChildAgentConnections)
            {
                UUID childSceneID = kvp.Value.SceneID;
                if (childSceneID == scene.ID)
                {
                    continue;
                }

                disconnects.Add(kvp.Key, kvp.Value);
            }

            /* remove all that stay active */
            foreach (KeyValuePair <UUID, SceneInterface.NeighborEntry> kvp in scene.Neighbors)
            {
                disconnects.Remove(kvp.Value.RemoteRegionData.Location);
            }

            /* connect new child agents */
            foreach (KeyValuePair <UUID, SceneInterface.NeighborEntry> kvp in scene.Neighbors)
            {
                if (!KnownChildAgentConnections.ContainsKey(kvp.Value.RemoteRegionData.Location))
                {
                    SceneInterface childScene;
                    if (m_Scenes.TryGetValue(kvp.Key, out childScene))
                    {
                        /* local connect */
#if DEBUG
                        m_Log.DebugFormat("Connect agent {0} to scene {1} as child locally", NamedOwner.FullName, childScene.ID);
#endif

                        UUID            seedId;
                        string          seedCapsUri  = NewCapsURL(childScene, out seedId);
                        var             udpServer    = (UDPCircuitsManager)childScene.UDPServer;
                        AgentCircuit    childCircuit = circuit.CreateChild(udpServer, seedId);
                        DestinationInfo connectInfo  = new DestinationInfo(kvp.Value.RemoteRegionData)
                        {
                            TeleportFlags = TeleportFlags.None
                        };
                        Circuits.Add(childScene.ID, childCircuit);
                        try
                        {
                            childScene.Add(this);
                            try
                            {
                                udpServer.AddCircuit(childCircuit);
                            }
                            catch
                            {
                                childScene.Remove(this);
                                continue;
                            }
                        }
                        catch
                        {
                            Circuits.Remove(childScene.ID);
                            continue;
                        }
                        EnableSimulator(scene.ID, circuit.CircuitCode, seedCapsUri, connectInfo);
                    }
                    else
                    {
                    }
                }
            }

            /* disconnect unneeded child agents */
            foreach (IChildAgentConnection conn in disconnects.Values)
            {
#if DEBUG
                m_Log.DebugFormat("Disconnect agent {0} from scene {1}", NamedOwner.FullName, conn.SceneID);
#endif
                conn.Disable();
            }
        }
Пример #23
0
        private void EstateOwner_Telehub(AgentCircuit circuit, EstateOwnerMessage req)
        {
            UInt32 param = 0;

            if (req.ParamList.Count < 1)
            {
                return;
            }
            var cmd = req.ParamList[0].FromUTF8Bytes();

            if ((cmd != "info ui" && cmd != "delete") &&
                (req.ParamList.Count < 2 ||
                 !UInt32.TryParse(req.ParamList[1].FromUTF8Bytes(), out param)))
            {
                return;
            }

            ObjectPart part;
            var        scene = circuit.Scene;

            switch (cmd)
            {
            case "connect":
                if (scene.Primitives.TryGetValue(param, out part))
                {
                    scene.SpawnPoints = new List <Vector3>();
                    scene.RegionSettings.TelehubObject = part.ObjectGroup.ID;
                    scene.TriggerRegionSettingsChanged();
                }
                break;

            case "delete":
                scene.SpawnPoints = new List <Vector3>();
                scene.RegionSettings.TelehubObject = UUID.Zero;
                scene.TriggerRegionSettingsChanged();
                break;

            case "spawnpoint add":
                if (scene.Primitives.TryGetValue(param, out part))
                {
                    scene.AddSpawnPoint(part.GlobalPosition);
                }
                break;

            case "spawnpoint remove":
                scene.RemoveSpawnPoint(param);
                break;

            default:
                break;
            }

            var res = new TelehubInfo
            {
                ObjectID = scene.RegionSettings.TelehubObject
            };

            if (scene.Primitives.TryGetValue(res.ObjectID, out part))
            {
                res.ObjectName = part.Name;
                res.TelehubPos = part.GlobalPosition;
                res.TelehubRot = part.GlobalRotation;
            }

            res.SpawnPoints.AddRange(scene.SpawnPoints);
            SendMessageAlways(res, scene.ID);
        }
 public ExtenderCapabilityCaller(ViewerAgent agent, AgentCircuit circuit, Action <ViewerAgent, AgentCircuit, HttpRequest> del)
 {
     m_Agent    = new WeakReference(agent, false);
     m_Circuit  = new WeakReference(circuit, false);
     m_Delegate = del;
 }
Пример #25
0
        private void EstateOwner_TextureDetail(AgentCircuit circuit, EstateOwnerMessage req)
        {
            bool settingsChanged = false;

            var scene = circuit.Scene;

            try
            {
                foreach (var b in req.ParamList)
                {
                    string s          = b.FromUTF8Bytes();
                    var    splitfield = s.Split(' ');
                    if (splitfield.Length != 2)
                    {
                        continue;
                    }

                    var       corner      = Int16.Parse(splitfield[0]);
                    var       textureUUID = UUID.Parse(splitfield[1]);
                    AssetData data;
                    if (!circuit.Scene.AssetService.TryGetValue(textureUUID, out data))
                    {
                        if (circuit.Agent.AssetService.TryGetValue(textureUUID, out data))
                        {
                            circuit.Scene.AssetService.Store(data);
                        }
                        else
                        {
                            return;
                        }
                    }
                    if (data.Type != AssetType.Texture)
                    {
                        /* do not allow to set anything else than a texture here */
                        continue;
                    }

                    switch (corner)
                    {
                    case 0:
                        scene.RegionSettings.TerrainTexture1 = textureUUID;
                        settingsChanged = true;
                        break;

                    case 1:
                        scene.RegionSettings.TerrainTexture2 = textureUUID;
                        settingsChanged = true;
                        break;

                    case 2:
                        scene.RegionSettings.TerrainTexture3 = textureUUID;
                        settingsChanged = true;
                        break;

                    case 3:
                        scene.RegionSettings.TerrainTexture4 = textureUUID;
                        settingsChanged = true;
                        break;

                    default:
                        break;
                    }
                }
            }
            finally
            {
                if (settingsChanged)
                {
                    scene.TriggerRegionSettingsChanged();
                }
            }
        }
Пример #26
0
 private void EstateOwner_TextureCommit(AgentCircuit circuit, EstateOwnerMessage req)
 {
 }
Пример #27
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);
            }
        }
Пример #28
0
        private void EstateOwner_EstateAccessDelta(AgentCircuit circuit, EstateOwnerMessage req)
        {
            if (req.ParamList.Count < 3)
            {
                return;
            }

            var scene = circuit.Scene;
            var flags = (EstateAccessDeltaFlags)int.Parse(req.ParamList[1].FromUTF8Bytes());
            var prey  = UUID.Parse(req.ParamList[2].FromUTF8Bytes());
            var uui   = UGUI.Unknown;
            var ugi   = UGI.Unknown;

            if ((scene.GroupsNameService == null || !scene.GroupsNameService.TryGetValue(prey, out ugi)) &&
                (flags & (EstateAccessDeltaFlags.AddGroup | EstateAccessDeltaFlags.RemoveGroup)) != 0)
            {
                circuit.Agent.SendAlertMessage(this.GetLanguageString(circuit.Agent.CurrentCulture, "ChangingEstateAccessNotPossibleSinceGroupNotKnown", "Changing estate access not possible since group not known"), scene.ID);
                return;
            }
            if (!scene.AvatarNameService.TryGetValue(prey, out uui) &&
                (flags & (EstateAccessDeltaFlags.AddUser | EstateAccessDeltaFlags.AddManager | EstateAccessDeltaFlags.AddBan |
                          EstateAccessDeltaFlags.RemoveUser | EstateAccessDeltaFlags.RemoveManager | EstateAccessDeltaFlags.RemoveBan)) != 0)
            {
                circuit.Agent.SendAlertMessage(this.GetLanguageString(circuit.Agent.CurrentCulture, "ChangingEstateAccessNotPossibleSinceAgentNotKnown", "Changing estate access not possible since agent not known"), scene.ID);
                return;
            }

            EstateInfo estate;
            uint       estateID;
            var        allEstateIds  = new List <uint>();
            var        estateService = circuit.Scene.EstateService;

            if (estateService.RegionMap.TryGetValue(circuit.Scene.ID, out estateID) &&
                estateService.TryGetValue(estateID, out estate))
            {
                if ((flags & EstateAccessDeltaFlags.AllEstates) != 0)
                {
                    allEstateIds = estateService.EstateOwner[estate.Owner];
                }
                else
                {
                    allEstateIds.Add(estateID);
                }
            }

            if (allEstateIds.Count == 0)
            {
                circuit.Agent.SendAlertMessage(this.GetLanguageString(circuit.Agent.CurrentCulture, "ChangingEstateAccessNotPossibleSinceNoEstateFound", "Changing estate access not possible since no estate found"), scene.ID);
                return;
            }

            var userUpdate  = false;
            var groupUpdate = false;
            var banUpdate   = false;
            var emUpdate    = false;

            foreach (var selectedEstateId in allEstateIds)
            {
                if ((flags & EstateAccessDeltaFlags.AddUser) != 0)
                {
                    estateService.EstateAccess[selectedEstateId, uui] = true;
                    userUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.RemoveUser) != 0)
                {
                    estateService.EstateAccess[selectedEstateId, uui] = false;
                    userUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.AddGroup) != 0)
                {
                    estateService.EstateGroup[selectedEstateId, ugi] = true;
                    groupUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.RemoveGroup) != 0)
                {
                    estateService.EstateGroup[selectedEstateId, ugi] = false;
                    groupUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.AddManager) != 0)
                {
                    estateService.EstateManager[selectedEstateId, uui] = true;
                    emUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.RemoveManager) != 0)
                {
                    estateService.EstateManager[selectedEstateId, uui] = false;
                    emUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.AddBan) != 0)
                {
                    estateService.EstateBans[selectedEstateId, uui] = true;
                    banUpdate = true;
                }
                if ((flags & EstateAccessDeltaFlags.RemoveBan) != 0)
                {
                    estateService.EstateBans[selectedEstateId, uui] = false;
                    banUpdate = true;
                }
            }

            if (emUpdate)
            {
                SendEstateList(
                    req.TransactionID,
                    req.Invoice,
                    EstateAccessFlags.Managers,
                    scene.EstateService.EstateManager.All[estateID],
                    estateID,
                    req.CircuitSceneID);
            }

            if (userUpdate)
            {
                SendEstateList(
                    req.TransactionID,
                    req.Invoice,
                    EstateAccessFlags.AllowedAgents,
                    scene.EstateService.EstateAccess.All[estateID],
                    estateID,
                    req.CircuitSceneID);
            }

            if (groupUpdate)
            {
                SendEstateList(
                    req.TransactionID,
                    req.Invoice,
                    scene.EstateService.EstateGroup.All[estateID],
                    estateID,
                    req.CircuitSceneID);
            }

            if (banUpdate)
            {
                SendEstateList(
                    req.TransactionID,
                    req.Invoice,
                    EstateAccessFlags.BannedAgents,
                    scene.EstateService.EstateBans.All[estateID],
                    estateID,
                    req.CircuitSceneID);
            }
        }
        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);
        }
 public SimConsoleAsyncTTY(AgentCircuit c)
 {
     m_Circuit = c;
 }