public void Add(ObjectLockingEventArgs objectsLockingEvent) { if (IsSceneOrProject(objectsLockingEvent.ObjectIds.FirstOrDefault())) //in the list, there should be always only objects or only projects/scenes, so taking the first id should work { OnObjectLockingEvent?.Invoke(this, objectsLockingEvent); } else { lock (events) { events.Add(objectsLockingEvent); } } InvokeEvents(); }
private void InvokeEvents() { if (!canInvoke) { if (SceneManager.Instance.Valid || ProjectManager.Instance.Valid) //if there is no locked object when app started, class misses onprojectloaded event { OnProjectOrSceneLoaded(null, null); return; } if (wasAppKilled) //check for my locks, which are needed to be unlocked, because UI was reset //Debug.LogError("!caninvoke + app was killer"); { lock (events) { if (!wasAppKilled) //check again { return; } List <ObjectLockingEventArgs> toRemove = new List <ObjectLockingEventArgs>(); foreach (ObjectLockingEventArgs ev in events) { if (ev.Locked && ev.Owner == LandingScreen.Instance.GetUsername()) { foreach (var id in ev.ObjectIds) { WebsocketManager.Instance.WriteUnlock(id); //if the app was killed, unlock my locks, because UI doesnt know what menu should be opened } toRemove.Add(ev); } } events.RemoveAll(ev => toRemove.Contains(ev)); } } return; } wasAppKilled = false; lock (events) { foreach (ObjectLockingEventArgs ev in events) { //Debug.LogError("invokuju" + ev.ObjectId); OnObjectLockingEvent?.Invoke(this, ev); } events.Clear(); } }