/// <summary> /// Wire up the references of an entity /// </summary> /// <param name="entity"></param> private void InjectMultiReferences(IDbEntity entity) { Type type = entity.GetType(); EntityInfo infos = GetEntityInfo(type); bool changed = false; // single refs foreach (MultipleReferenceProperty referenceProperty in infos.MultipleReferenceInjectors) { IList list = (IList)referenceProperty.PropertyAccessor.GetValue(entity); if (LoadDbMultiReference(entity, list)) { changed = true; } } // trigger if event is entity is changed if (changed) { OnEntityChanged?.Invoke(entity); } }
/// <summary> /// Wire up the references of an entity /// </summary> /// <param name="entity"></param> private void InjectSingleReferences(IDbEntity entity) { Type entityType = entity.GetType(); EntityInfo infos = GetEntityInfo(entityType); bool changed = false; // single refs foreach (SingleReferenceProperty referenceProperty in infos.SingleReferenceInjectors) { IDbReference dbReference = (IDbReference)referenceProperty.PropertyAccessor.GetValue(entity); if (LoadSingleDbReference(entityType, entity, dbReference)) { changed = true; } } // trigger if event is entity is changed if (changed) { OnEntityChanged?.Invoke(entity); } }
internal void EntityChanged(IEntity entity, GameTag tag, int oldValue, int newValue) { if ((tag == GameTag.DAMAGE && ((ICharacter)entity).Health <= 0) || (tag == GameTag.TO_BE_DESTROYED && newValue == 1)) { _deathCheckQueue.Add(entity.Id); } // TODO: Minions who reach 0 current Health because their maximum Health becomes 0 (such as due to Confuse) also need to be added to _deathCheckQueue OnEntityChanged?.Invoke(this, entity, tag, oldValue, newValue); }
/// <summary> /// Запуск эмуляции /// </summary> public async void Start() { EngineStatus = true; OnStatusChanged?.Invoke(EngineStatus); await Task.Run(() => { bool _newDay = true; while (EngineStatus) { //Если не прошел день, то эмулируем его if (CurrentHour < 24) { //Обрабатываем ТУ _entityList.Each((e, id) => { //Если это первый цикл дня, то надо сбросить Кол-во отказов if (_newDay) { e.Settings.Z = _entitySettings.Z; } //Если ТУ в процессе починки, то пропускаем его if (e.Status == EntityStatus.EntityInRepairing) { goto each_cont; } //Если устройство сломано, то ищем, линию, на которой есть свободное место if (e.Status == EntityStatus.EntityBroken) { tryFix(); goto each_cont; } //Если с устройством все норм, то смотрим, можно ли его сломать //Если устройство сломалось, то пытаемся его починить if (MathTools.GetChance(e.Settings.Z / 24m)) { //Уменьшаем вероятность отказа (также ограничиваем снизу) e.Settings.Z--; if (e.Settings.Z <= 0) { e.Settings.Z = 0; } e.Status = EntityStatus.EntityBroken; OnEntityChanged?.Invoke(id, e.Status); tryFix(); } each_cont: //Вложенный метод, для попытки отправить ТУ на починку void tryFix() { var line = _fixingLines.Where(x => x.Count < _engineSettings.L).OrderBy(x => x.Count).FirstOrDefault(); if (line != null) { e.Status = EntityStatus.EntityInRepairing; line.Enqueue(e); OnEntityChanged?.Invoke(id, e.Status); } } }); foreach (Queue <Entity> q in _fixingLines) { //Если линия пуста, то пропускаем ее if (q.Count == 0) { continue; } //Берем первое ТУ и смотрим, можно ли его починить var e = q.Peek(); //Есил починить можно if (MathTools.GetChance((decimal)MathTools.Qt(e.DaysInFix, MathTools.Lambda(e.Settings.R)))) { //Обнуляем кол-во дней, которое было потрачено на ремонт e.DaysInFix = 0; //Ставим статус нужный e.Status = EntityStatus.EntityFixed; //Убираем ТУ с очереди q.Dequeue(); OnEntityChanged?.Invoke(e.Id, e.Status); } } _newDay = false; OnHourTick?.Invoke(CurrentHour); CurrentHour++; Thread.Sleep(_engineSettings.HourTime);//Один час симуляции } else { //Увеличиваем у каждого время починки (у тех, которые чинятся) foreach (Entity e in _entityList) { if (e.Status != EntityStatus.EntityInRepairing) { continue; } e.DaysInFix++; } CurrentHour = 0; TotalDays++; _newDay = false; OnNewDay?.Invoke(TotalDays); } } OnStatusChanged?.Invoke(EngineStatus); }); }
public override void TransformBy(Transformation transform) { base.TransformBy(transform); OnTransformed?.Invoke(this, new TransformingEventArgs(transform)); OnEntityChanged?.Invoke(this, null); }
/// <summary> /// Remove entity from Db /// </summary> /// <typeparam name="T"></typeparam> /// <param name="t"></param> public void Remove <T>(T t) where T : IDbEntity { AddType <T>(); Type type = typeof(T); Database[type].Remove(t); // check entity references foreach (KeyValuePair <Type, HashSet <IDbEntity> > kv in Database) { Type entityType = kv.Key; EntityInfo infos = GetEntityInfo(entityType); foreach (IDbEntity entity in kv.Value) { bool changed = false; // single refs foreach (SingleReferenceProperty referenceProperty in infos.SingleReferenceInjectors) { IDbReference dbReference = (IDbReference)referenceProperty.PropertyAccessor.GetValue(entity); if (dbReference.ReferenceId == t.EntityId && dbReference.EntityType == type) { dbReference.ReferenceId = null; dbReference.Entity = null; changed = true; } } // multiple refs foreach (MultipleReferenceProperty referenceProperty in infos.MultipleReferenceInjectors) { IList dbReference = (IList)referenceProperty.PropertyAccessor.GetValue(entity); if (dbReference == null) { continue; } for (int i = dbReference.Count - 1; i >= 0; i--) { IDbReference reference = (IDbReference)dbReference[i]; if (reference.ReferenceId == t.EntityId && reference.EntityType == type) { dbReference.RemoveAt(i); changed = true; } } } if (changed) { OnEntityChanged?.Invoke(entity); } } } OnDatabaseChanged?.Invoke(this); OnEntityRemoved?.Invoke(t); }
public void NotifyEntityChanged() { OnEntityChanged?.Invoke(this.View, null); }
/// <summary> /// 单个实例有变更 /// <para>触发</para> /// </summary> protected void RaiseEntityChanged() { DHelper.InvokeOnMain(() => OnEntityChanged?.Invoke(Entity)); }