Exemplo n.º 1
0
        private void OnDiffedEvent(TotalHealthDiff diff)
        {
            var container   = writer.Data.TroopContainer;
            var simpleUnits = container.SimpleUnits;
            var count       = simpleUnits.Count;

            if (count == 0)
            {
                return;
            }

            var perDamage = diff.HealthDiff / count;
            var keys      = simpleUnits.Keys;

            foreach (var k in keys)
            {
                var simple = simpleUnits[k];
                simple.Health  = Mathf.Max(0, simple.Health - perDamage);
                simpleUnits[k] = simple;
            }

            container.SimpleUnits = simpleUnits;

            writer.SendUpdate(new VirtualTroop.Update()
            {
                TroopContainer = container,
            });
        }
        protected override void OnUpdate()
        {
            if (CheckTime(ref inter) == false)
            {
                return;
            }

            var damageDic = new Dictionary <EntityId, TroopDamage>();

            Entities.With(group).ForEach((Entity entity,
                                          ref VirtualTroop.Component troop,
                                          ref BaseUnitStatus.Component status,
                                          ref SpatialEntityId entityId) =>
            {
                if (status.State != UnitState.Alive)
                {
                    return;
                }

                var trans = EntityManager.GetComponentObject <Transform>(entity);
                var pos   = trans.position;

                var boidRange = RangeDictionary.GetBoidsRange(status.Rank);
                var range     = boidRange * sightRate;
                var unit      = getNearestPlayer(pos, range, selfId: null);

                if ((unit == null) == troop.IsActive)
                {
                    if (CheckConflict(ref troop, status.Side, trans, status.Rank, out var damage))
                    {
                        damageDic[damage.id] = damage;
                    }
                }
                else
                {
                    UpdateContainer(ref troop, unit == null, status.Side, trans, boidRange, status.Rank);
                }
            });

            // SendDamage
            foreach (var kvp in damageDic)
            {
                var diff = new TotalHealthDiff(kvp.Value.healthDiff);
                this.UpdateSystem.SendEvent(new VirtualTroop.TotalHealthDiff.Event(diff), kvp.Key);
            }
        }