public override void NotifyNeighborStatus(RegionInfo fromRegion) { SceneInterface fromScene; if (m_Scenes.TryGetValue(fromRegion.ID, out fromScene)) { if ((fromRegion.Flags & RegionFlags.RegionOnline) != 0) { m_NeighborLists.GetOrAddIfNotExists(fromRegion.ID, () => new NeighborList()); foreach (RegionInfo neighbor in NeighborRequester.GetNeighbors(fromScene.GridService, fromRegion)) { SceneInterface scene; if (m_Scenes.TryGetValue(neighbor.ID, out scene)) { scene.NotifyNeighborOnline(fromRegion); } } } else { NeighborList list; if (m_NeighborLists.Remove(fromRegion.ID, out list)) { foreach (UUID id in list.Keys) { SceneInterface scene; if (m_Scenes.TryGetValue(id, out scene)) { scene.NotifyNeighborOffline(fromRegion); } } } } } }
private void IMSessionStarted(GroupInstantMessage im) { if (!m_GroupsService.Members.ContainsKey(im.FromAgent, im.ToGroup, im.FromAgent)) { throw new Exception("Not a member"); } GroupSession session = m_ActiveChats.GetOrAddIfNotExists(im.ToGroup.ID, () => new GroupSession(im.ToGroup)); im.IMSessionID = session.SessionID; im.FromGroup = im.ToGroup; try { foreach (GroupMember gm in m_GroupsService.Members[im.FromAgent, im.ToGroup]) { session.Participants.AddIfNotExists(gm.Principal); } } finally { m_ActiveSessions.RemoveIf(im.IMSessionID, (entry) => entry.Participants.Count == 0); m_ActiveChats.RemoveIf(im.ToGroup.ID, (entry) => entry.Participants.Count == 0); } DistributeMessage(session, im); }
public override Listener AddListen(int channel, string name, UUID id, string message, Func <UUID> getuuid, Func <UGI> getgroup, Func <Vector3> getpos, Func <UUID> getowner, Action <ListenEvent> send) { var li = new ListenerInfo(this, channel, name, id, message, getuuid, getgroup, getpos, getowner, send, false); ChannelInfo ci = m_Channels.GetOrAddIfNotExists(channel, () => { var newci = new ChannelInfo(this); newci.Listeners.Add(li); return(newci); }); /* check whether we had a fresh add of ChannelInfo */ if (ci.Listeners.Contains(li)) { return(li); } ci.Listeners.Add(li); return(li); }
public ObjectPartLocalizedInfo GetOrCreateLocalization(string culturename) { if (string.IsNullOrEmpty(culturename)) { return(m_DefaultLocalization); } try { CultureInfo.CreateSpecificCulture(culturename); } catch { throw new ArgumentOutOfRangeException(nameof(culturename)); } return(m_NamedLocalizations.GetOrAddIfNotExists(culturename, () => new ObjectPartLocalizedInfo(culturename, this, m_DefaultLocalization))); }
public static ScriptInstance Load(ObjectPart part, ObjectPartInventoryItem item, UGUI user, AssetData data, CultureInfo currentCulture, byte[] serializedState = null, Func <string, TextReader> openInclude = null) { return(m_CompilerLock.AcquireReaderLock(() => { IScriptAssembly assembly = m_LoadedAssemblies.GetOrAddIfNotExists(data.ID, () => { using (var reader = new StreamReader(data.InputStream)) { return CompilerRegistry.ScriptCompilers.Compile(AppDomain.CurrentDomain, user, data.ID, reader, currentCulture, openInclude); } }); ScriptInstance instance = assembly.Instantiate(part, item, serializedState); m_LoadedInstances.GetOrAddIfNotExists(data.ID, () => new RwLockedList <ScriptInstance>()).Add(instance); return instance; })); }
public Notecard this[UUID assetid] { get { Notecard v; if (m_Notecards.TryGetValue(assetid, out v)) { return(v); } AssetData asset = m_Scene.AssetService[assetid]; if (asset.Type != AssetType.Notecard) { throw new NotANotecardFormatException(); } m_LastAccessed[assetid] = Environment.TickCount; return(m_Notecards.GetOrAddIfNotExists(assetid, () => new Notecard(asset))); } }
public UUID GetOrCreateIMSession(UUID targetid) => m_ScriptedIMSessions.GetOrAddIfNotExists(targetid, () => UUID.Random);