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);
            }
        }
        private void HandleRequest()
        {
            Entities.With(group).ForEach((Unity.Entities.Entity entity,
                                          ref UnitArmyObserver.Component observer,
                                          ref BaseUnitStatus.Component status,
                                          ref SpatialEntityId entityId) =>
            {
                if (status.State != UnitState.Alive)
                {
                    return;
                }

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

                var inter = observer.Interval;
                if (inter.CheckTime() == false)
                {
                    return;
                }

                observer.Interval = inter;

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

                var hq = getNearestAlly(status.Side, pos, RangeDictionary.Get(FixedRangeType.RadioRange), UnitType.HeadQuarter);
                if (hq == null)
                {
                    return;
                }

                Entity hqEntity;
                if (TryGetEntity(hq.id, out hqEntity) == false)
                {
                    return;
                }

                var list = getAllyUnits(status.Side, pos, RangeDictionary.Get(FixedRangeType.BaseRange), UnitType.Commander);
                foreach (var unit in list)
                {
                    CommanderStatus.Component?comp;
                    if (TryGetComponent(unit.id, out comp) == false)
                    {
                        return;
                    }

                    CommanderTeam.Component?team;
                    if (TryGetComponent(unit.id, out team) == false)
                    {
                        return;
                    }

                    var id = entityId.EntityId.Id;
                    if (team.Value.SuperiorInfo.EntityId.IsValid())
                    {
                        requestedIds.Remove(id);
                        return;
                    }

                    if (requestedIds.Contains(id))
                    {
                        return;
                    }

                    var request = new HeadQuarters.AddOrder.Request(hq.id, new OrganizeOrder()
                    {
                        Customer     = unit.id,
                        CustomerRank = comp.Value.Rank,
                        Pos          = pos.ToFixedPointVector3(),
                        Side         = status.Side
                    });

                    this.CommandSystem.SendCommand(request, hqEntity);

                    requestedIds.Add(id);
                }
            });
        }
        private void MovementQuery(Entity entity,
                                   ref MovementData movement,
                                   ref NavPathData path,
                                   ref BaseUnitSight.Component sight,
                                   ref BaseUnitStatus.Component status,
                                   ref SpatialEntityId entityId)
        {
            movement.MoveSpeed = 0.0f;
            movement.RotSpeed  = 0.0f;

            if (status.State != UnitState.Alive)
            {
                return;
            }

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

            var unit = EntityManager.GetComponentObject <UnitTransform>(entity);

            // check ground
            if (unit == null || unit.GetGrounded(out var hitInfo) == false)
            {
                return;
            }

            if (sight.State == TargetState.None)
            {
                return;
            }

            var trans = unit.transform;
            var pos   = trans.position;

            Vector3?tgt    = null;
            Vector3 spread = Vector3.zero;

            var id = entityId.EntityId;

            if (vectorDic.ContainsKey(id))
            {
                //tgt = vectorDic[id].boidTarget;
                spread = vectorDic[id].spread;
            }

            if (tgt == null)
            {
                tgt = sight.GetTargetPosition(this.Origin, pos);
            }

            tgt = CheckNavPathAndTarget(tgt.Value, pos, unit.SizeRadius, sight.State, entityId.EntityId.Id, ref path);

            if (RangeDictionary.IsSpreadValid(spread))
            {
                var length = (tgt.Value - pos).magnitude;
                tgt += spread * Mathf.Max(1.0f, (length / RangeDictionary.SpreadSize));
            }

            var positionDiff = tgt.Value - pos;

            var forward = get_forward(positionDiff, sight.TargetRange);

            MovementDictionary.TryGet(status.Type, out var speed, out var rot);

            var isRotate = rotate(rot, trans, positionDiff);

            if (forward != 0.0f)
            {
                movement.MoveSpeed = forward * speed;
            }

            if (isRotate != 0)
            {
                movement.RotSpeed = rot * isRotate;
            }
        }
Esempio n. 6
0
        protected override void OnUpdate()
        {
            Entities.With(group).ForEach((Entity entity,
                                          ref HeadQuarters.Component headQuarter,
                                          ref BaseUnitStatus.Component status,
                                          ref SpatialEntityId entityId) =>
            {
                if (status.State != UnitState.Alive)
                {
                    return;
                }

                if (status.Type != UnitType.HeadQuarter)
                {
                    return;
                }

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

                if (headQuarter.Orders.Count == 0)
                {
                    return;
                }

                if (headQuarter.UpperRank >= headQuarter.MaxRank)
                {
                    return;
                }

                var inter = headQuarter.Interval;
                if (inter.CheckTime() == false)
                {
                    return;
                }

                headQuarter.Interval = inter;

                foreach (var order in headQuarter.Orders)
                {
                    var pos = order.Pos.ToWorkerPosition(this.Origin);
                    var str = getNearestAlly(status.Side, pos, RangeDictionary.Get(FixedRangeType.RadioRange), UnitType.Stronghold);
                    if (str == null)
                    {
                        continue;
                    }

                    var map = headQuarter.FactoryDatas;
                    uint u_rank;
                    SetSuperior(str.id, status.Side, order, ref map, entityId.EntityId, out u_rank);
                    headQuarter.FactoryDatas = map;
                    if (headQuarter.UpperRank < u_rank)
                    {
                        headQuarter.UpperRank = u_rank;
                    }
                }

                headQuarter.Orders.Clear();
            });
        }
        private void Query(Entity entity,
                           ref StrategyOrderManager.Component manager,
                           ref BaseUnitStatus.Component status,
                           ref SpatialEntityId spatialEntityId)
        {
            if (status.State != UnitState.Alive)
            {
                return;
            }

            if (status.Type != UnitType.HeadQuarter)
            {
                return;
            }

            var inter = manager.Interval;

            if (CheckTime(ref inter) == false)
            {
                return;
            }

            manager.Interval = inter;

            var trans = EntityManager.GetComponentObject <Transform>(entity);
            var range = RangeDictionary.Get(FixedRangeType.HeadQuarterRange);

            var enemy = getNearestEnemy(status.Side, trans.position);

            if (enemy == null)
            {
                return;
            }

            var entityId = new EntityId();

            entityId = enemy.id;

            var target = manager.TargetHq;

            if (target.HeadQuarterId != entityId)
            {
                manager.TargetHq = new TargetHeadQuartersInfo()
                {
                    HeadQuarterId = enemy.id,
                    Side          = enemy.side,
                    Position      = enemy.pos.ToWorldCoordinates(this.Origin),
                };
            }

            var st_range = RangeDictionary.Get(FixedRangeType.StrongholdRange);
            var allies   = getAllyUnits(status.Side, trans.position);
            var diff     = (enemy.pos - trans.position).normalized;

            foreach (var unit in allies)
            {
                if (unit.type != UnitType.Stronghold)
                {
                    continue;
                }

                SendCommand(unit.id, enemy.side, diff * st_range);
            }
        }