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; } }
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); }
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(); }
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); }
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); }
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(); }
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(); } } } }
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); } }
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(); } } } }
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); }
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.")); } } }
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(); }
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.")); } }
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.")); } }
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; } }
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); }
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 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(); }
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 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); }
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(); } }
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; }
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(); } } }
private void EstateOwner_TextureCommit(AgentCircuit circuit, EstateOwnerMessage req) { }
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); } }
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; }