public void Update(int delta) { if (!IsRunning) { return; } _pausedCoroutines.Lock(); foreach (Coroutine coroutine in _pausedCoroutines) { if (coroutine.IsRunning) // checks if a coroutine it's running again { _pausedCoroutines.Remove(coroutine); _runningCoroutines.Add(coroutine); } } _pausedCoroutines.Unlock(); _runningCoroutines.Lock(); foreach (Coroutine coroutine in _runningCoroutines) { coroutine.Update(delta); if (coroutine.HasEnded) // remove ended coroutine { _runningCoroutines.Remove(coroutine); } else if (!coroutine.IsRunning) // move paused coroutine to the proper list { _runningCoroutines.Remove(coroutine); _pausedCoroutines.Add(coroutine); } } _runningCoroutines.Unlock(); }
/// <summary> /// Adds an IUpdatable, IRenderable or ISceneObject to Scene. /// Type can implements one or more of them. /// </summary> /// <typeparam name="T">Class based on IUpdatable, IRenderable and/or ISceneObject.</typeparam> /// <param name="obj">Object to add.</param> /// <returns>Reference to the object.</returns> public T Add <T>(T obj) { if (obj == null) { throw new System.ArgumentNullException(nameof(obj)); } if (obj is Entity entity) { return((T)(ISceneObject)AddEntity(entity)); } else if (obj is Graphic graphic) { return((T)(IRenderable)AddGraphic(graphic)); } bool added = false; if (obj is IUpdatable updatable) { AddUpdatable(updatable); added = true; } if (obj is IRenderable renderable) { _renderables.Add(renderable); added = true; } if (obj is ISceneObject sceneObject) { _sceneObjects.Add(sceneObject); added = true; sceneObject.SceneAdded(this); if (HasStarted && !sceneObject.HasStarted) { sceneObject.Start(); } } if (!added) { throw new System.ArgumentException("Object must be an ISceneObject, IUpdatable or IRenderable."); } return(obj); }
private void AddUpdatable(IUpdatable updatable) { _updatables.Add(updatable); if (IsControlGroupPaused(updatable.ControlGroup)) { updatable.Active = false; } }
public override void OnStart() { Locker.Add(LockerKeys.ROOM_SETTINGS, new RoomSettingsModel() { UseWholeNumbers = true, UseNumericKeyboard = true, }); Locker.Add(LockerKeys.ROOM_EVENT_SERVICE, new EventService()); }
// public string SubmitWorkflow(SubmitInfo_DTO submitInfo) // { // if (submitInfo == null) // return "提交信息不能为空!"; // if (!string.IsNullOrEmpty(_iSubmitValidation.ValidateMsg(submitInfo.SubmitResult))) // return _iSubmitValidation.ValidateMsg(submitInfo.SubmitResult); // if (!Locker.Add(submitInfo.NodeId)) // return "请不要重复提交!"; // // 读取模板 // TemplateRepository tr = new TemplateRepository(Context); // InstanceInfoRepository iir = new InstanceInfoRepository(Context); // NodeInfoRepository nir = new NodeInfoRepository(Context); // HashSet<Guid> newActivities = new HashSet<Guid>(); // var node = nir.Get(submitInfo.NodeId); // if (node != null) // { // node.SubmitResult = submitInfo.SubmitResult; // var instance = iir.Get(node.InstanceId); // if (instance != null) // { // var templateInfo = tr.Get(instance.TemplateId); // // 解析 // XElement doc = XElement.Parse(templateInfo.TemplateText); // // 结束并发 // if (submitInfo.SubmitResult.StartsWith(SubmitTypeEnum._SP.ToString())) // { // // 停止并发 // TransRouting.StopParallel(doc, instance.TaskId, node, Context, node.NodeId); // } // // 驳回 // else if (submitInfo.SubmitResult.StartsWith(SubmitTypeEnum._BK.ToString())) // { // // 找到要驳回的点的名称 // string backNodeName = submitInfo.SubmitResult.Substring(4); // // 在模板上找到的对应的点 // XElement templateXml = XElement.Parse(templateInfo.TemplateText); // var nodeInfos = from c in templateXml.Elements("DesignerItems").Elements("DesignerItem") // where c.Element("Name").Value == backNodeName // select c; // if (nodeInfos.Count() == 0) // throw new Exception("驳回的点不存在!"); // // 结束该点下的所有点 //#warning 上一节点,下一个节点 // HashSet<Guid> stopAllNodes = new HashSet<Guid>(); // HashSet<Guid> hasAlreadyFinds = new HashSet<Guid>(); // TransRouting.FindAllNext(templateXml, nodeInfos.First(), node.TaskId, node.InstanceId, Context, stopAllNodes, hasAlreadyFinds); // stopAllNodes.Add(node.NodeId); // var stopNodeInfos = Context.NSNodeInfos.Where(p => p.InstanceId == node.InstanceId && p.RunState == RUNNING && stopAllNodes.Contains(p.NodeId)); // foreach (var nodeInfo in stopNodeInfos) // { // nodeInfo.RunState = RunStateEnum.end.ToString(); // } // TransRouting.Routing(doc, nodeInfos.First(), node, Context, newActivities); // } // else // { // /// 查找驳回点并生成新的节点 // var custsExc = from c in doc.Elements("Connections").First().Elements("Connection") // where c.Element("SourceID").Value == node.NodeId.ToString() // select c.Element("SinkID").Value; // // 结束当前的点 // node.RunState = RunStateEnum.end.ToString(); // nir.Modify(node); // foreach (var item in custsExc) // { // // 获取节点名称 // var nodeInfos = from c in doc.Elements("DesignerItems").Elements("DesignerItem") // where c.Element("ID").Value == item // select c; // foreach (var nodeInfo in nodeInfos) // { // TransRouting.Routing(doc, nodeInfo, node, Context, newActivities); // } // } // } // // 回到父流程节点 // var finisheds = TransRoutingHelper.InstanceFinished(newActivities, node.TaskId, node.InstanceId, Context); // // 新生成的节点 // foreach (var item in finisheds) // { // // 首先获取模板上面的ID // var parentNode = nir.Get(item); // if (parentNode != null) // { // var instnace = iir.Get(parentNode.InstanceId); // XElement parentDoc =XElement.Parse(tr.Get(instance.TemplateId).TemplateText); // // 获取节点名称 // var nodeInfos = from c in parentDoc.Elements("DesignerItems").Elements("DesignerItem") // where c.Element("ID").Value == parentNode.NodeId.ToString() // select c; // foreach (var nodeInfo in nodeInfos) // { // TransRouting.Routing(doc, nodeInfo, parentNode, Context, newActivities); // } // } // } // } // } // try // { // Context.SaveChanges(); // } // catch (DbEntityValidationException e) // { // StringBuilder sb = new StringBuilder(); // foreach (var eve in e.EntityValidationErrors) // { // sb.Append(string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", // eve.Entry.Entity.GetType().Name, eve.Entry.State)); // foreach (var ve in eve.ValidationErrors) // { // sb.Append(string.Format("- Property: \"{0}\", Error: \"{1}\"", // ve.PropertyName, ve.ErrorMessage)); // } // } // return sb.Append("持久化失败!").ToString(); // } // catch (Exception ex) // { // return "提交失败"; // } // return "提交成功!"; // } public string SubmitWorkflow(SubmitInfo_DTO submitInfo) { StringBuilder result = new StringBuilder(); try { #region 验证 if (submitInfo == null) { return("提交信息不能为空!"); } if (!Locker.Add(submitInfo.NodeId)) { return("请不要重复提交!"); } #endregion (验证) #region 获取节点信息 TransInfoDto transInfoDto = new TransInfoDto(); transInfoDto.Persistence = DBFactory.GetPersistencePlugIn(); transInfoDto.Context = transInfoDto.Persistence.Context; transInfoDto.GroupCounter = submitInfo.ExpandDatas == null ? 0 : submitInfo.ExpandDatas.Count(); var activity = transInfoDto.Persistence.GetActivityByID(submitInfo.NodeId); if (activity == null) { return("要办理的节点已经不存在!"); } #endregion (获取节点信息) #region 获取模板信息 var instance = transInfoDto.Persistence.GetInsanceInfo(activity.InstanceId); var template = transInfoDto.Persistence.GetTemplateInfo(instance.TemplateId); #endregion (获取模板信息) #region 生成DTO信息 transInfoDto.TaskId = activity.TaskId; transInfoDto.InstanceId = activity.InstanceId; transInfoDto.InstanceNodeId = activity.NodeId; transInfoDto.TemplateXml = template.TemplateText; transInfoDto.ActivityType = ActivityTypeEnum.Process; transInfoDto.Condition = submitInfo.Condition; transInfoDto.SubmitType = EnumHelper.GetEnumByString <SubmitTypeEnum>(submitInfo.SubmitResult); #endregion (生成DTO信息) var currentActivity = XmlHelper.GetActivitiesByName(template.TemplateText, activity.NodeName).First(); transInfoDto.Activity = currentActivity; if (!string.IsNullOrEmpty(_iSubmitValidation.ValidateMsg(submitInfo.SubmitResult, transInfoDto))) { Locker.Remove(submitInfo.NodeId); return(_iSubmitValidation.ValidateMsg(submitInfo.SubmitResult, transInfoDto)); } #region 提交 new RoutingHost().EndRouing(transInfoDto); #endregion (提交) transInfoDto.Persistence.Context.SaveChanges(); } catch (WFRoutingException rex) { LogHelper.WriteLog(rex.Message + rex.ToString()); } catch (Exception ex) { LogHelper.WriteLog(ex.ToString()); } return(result.ToString()); }
/// <summary> /// Adds a Transform as a child. /// A transform can already be a child from another parent, in that case the parent will be properly changed without side-effects (ie. triggering unwanted events from the same scene). /// </summary> /// <param name="transform">A transform to be added as a new child.</param> /// <param name="changeScene">Signalizes that transform.Entity.Scene can be changed to match parent Scene.</param> /// <param name="force">Indicates that scene change can be forced if necessary. When adding a child that already belongs to a Scene and the intention is to match the parent Scene.</param> public void AddChild(Transform transform, bool changeScene = true, bool force = false) { if (transform == this || IsDetached || Entity.IsWiped || transform.IsDetached || transform.Entity.IsWiped || _children.Contains(transform)) { return; } if (changeScene) { if (transform.Parent != null) { if (transform.Entity.IsSceneFromTransformAncestor) { if (transform.Scene != Scene && transform.Scene != null) { transform.Entity.SceneRemoved(allowWipe: false); transform.Entity.IsSceneFromTransformAncestor = false; } } else if (force) { if (transform.Scene != Scene && transform.Scene != null) { transform.Scene.RemoveEntity(transform.Entity, wipe: false); } } transform.OnParentRemoved(); transform.Parent._children.Remove(transform); transform.Parent.OnChildRemoved(transform); } if (transform.Scene == null) { if (Scene != null) { transform.Entity.SceneAdded(Scene); if (Scene.HasStarted && !transform.Entity.HasStarted) { transform.Entity.Start(); } } transform.Entity.IsSceneFromTransformAncestor = true; } else if (force) { if (transform.Scene != Scene) { transform.Scene.RemoveEntity(transform.Entity, wipe: false); if (Scene != null) { transform.Entity.SceneAdded(Scene); if (Scene.HasStarted && !transform.Entity.HasStarted) { transform.Entity.Start(); } } } transform.Entity.IsSceneFromTransformAncestor = true; } } else { if (transform.Parent != null) { transform.OnParentRemoved(); transform.Parent._children.Remove(transform); transform.Parent.OnChildRemoved(transform); } if (transform.Entity.IsSceneFromTransformAncestor) { transform.Entity.IsSceneFromTransformAncestor = false; } } transform._parent = this; transform.OnParentAdded(); _children.Add(transform); OnChildAdded(transform); }
public Coroutine RegisterCoroutine(Coroutine coroutine) { _coroutines.Add(coroutine); return(coroutine); }