Ejemplo n.º 1
0
        protected override void OnUpdate()
        {
            if (CheckTime(ref inter) == false)
            {
                return;
            }

            Entities.With(group).ForEach((Entity entity,
                                          ref BoidComponent.Component boid,
                                          ref BaseUnitStatus.Component status,
                                          ref BaseUnitTarget.Component target,
                                          ref CommanderStatus.Component commander,
                                          ref BaseUnitMovement.Component movement,
                                          ref SpatialEntityId entityId) =>
            {
                if (status.State != UnitState.Alive)
                {
                    return;
                }

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

                var side          = status.Side;
                var speed         = movement.MoveSpeed;
                var forward       = trans.forward;
                var commanderRank = status.Rank;

                var soldierRange = RangeDictionary.BaseBoidsRange;
                var soldiers     = getAllyUnits(side, pos, soldierRange, allowDead: false, selfId: entityId.EntityId, GetSingleUnitTypes(UnitType.Soldier));

                float f_length = boid.ForwardLength;
                boid_calculate(pos + forward * f_length, pos, soldierRange, forward * speed,
                               boid.SepareteWeight, boid.AlignmentWeight, boid.CohesionWeight, soldiers);

                if (commanderRank < 1)
                {
                    return;
                }

                var commanderRange = RangeDictionary.GetBoidsRange(commanderRank);
                var coms           = getAllyUnits(side, pos, commanderRange, allowDead: false, selfId: entityId.EntityId, GetSingleUnitTypes(UnitType.Commander));
                commanders.Clear();
                foreach (var c in coms)
                {
                    if (c.rank == commanderRank - 1)
                    {
                        commanders.Add(c);
                    }
                }

                f_length  = AttackLogicDictionary.RankScaled(f_length, commanderRank);
                f_length += commander.AllyRange;

                boid_calculate(pos + forward * f_length, pos, commanderRange, forward * speed,
                               boid.SepareteWeight, boid.AlignmentWeight, boid.CohesionWeight, commanders);
            });
        }
        private void TeamQuery(Entity entity,
                               ref CommanderSight.Component sight,
                               ref CommanderTeam.Component team,
                               ref BaseUnitStatus.Component status,
                               ref SpatialEntityId entityId)
        {
            if (status.State != UnitState.Alive)
            {
                return;
            }

            if (UnitUtils.IsOfficer(status.Type) == false)
            {
                return;
            }

            if (status.Order == OrderType.Idle)
            {
                return;
            }

            if (status.Rank == 0)
            {
                return;
            }

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

            team.FollowerInfo.UnderCommanders.Clear();

            var rank   = status.Rank - 1;
            var range  = RangeDictionary.GetBoidsRange(status.Rank);
            var allies = getAllyUnits(status.Side, pos, range, allowDead: false, GetSingleUnitTypes(UnitType.Commander));

            foreach (var unit in allies)
            {
                if (unit.id == entityId.EntityId)
                {
                    continue;
                }

                BaseUnitStatus.Component?sts;
                if (this.TryGetComponent(unit.id, out sts) == false)
                {
                    continue;
                }

                if (sts.Value.Rank != rank)
                {
                    continue;
                }

                team.FollowerInfo.UnderCommanders.Add(unit.id);
            }
        }
        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);
            }
        }