private void DoTracking(float frameTime)
        {
            // not valid entity to target.
            if (_curTarget == null || !_curTarget.IsValid())
            {
                _curTarget = null;
                return;
            }

            // point me at the target
            var tarPos        = _curTarget.GetComponent <ITransformComponent>().WorldPosition;
            var selfTransform = SelfEntity.GetComponent <ITransformComponent>();
            var myPos         = selfTransform.WorldPosition;

            var curDir = selfTransform.LocalRotation.ToVec();
            var tarDir = (tarPos - myPos).Normalized;

            var fwdAng = Vector2.Dot(curDir, tarDir);

            Vector2 newDir;

            if (fwdAng < 0)                                                             // target behind turret, just rotate in a direction to get target in front
            {
                var curRight   = new Vector2(-curDir.Y, curDir.X);                      // right handed coord system
                var rightAngle = Vector2.Dot(curDir, new Vector2(-tarDir.Y, tarDir.X)); // right handed coord system
                var rotateSign = -Math.Sign(rightAngle);
                newDir = curDir + curRight * rotateSign * MaxAngSpeed * frameTime;
            }
            else // target in front, adjust to aim at him
            {
                newDir = MoveTowards(curDir, tarDir, MaxAngSpeed, frameTime);
            }

            selfTransform.LocalRotation = new Angle(newDir);

            if (fwdAng > -0.9999)
            {
                // TODO: shoot gun, prob need aimbot because entity rotation lags behind moving target
            }
        }
Esempio n. 2
0
        private IEntity FindBestTarget()
        {
            // "best" target is the closest one with LOS

            var ents        = _entMan.GetEntitiesInRange(SelfEntity, VisionRadius);
            var myTransform = SelfEntity.GetComponent <IServerTransformComponent>();
            var maxRayLen   = VisionRadius * 2.5f; // circle inscribed in square, square diagonal = 2*r*sqrt(2)

            _workList.Clear();
            foreach (var entity in ents)
            {
                // filter to "people" entities (entities with controllers)
                if (!entity.HasComponent <IMoverComponent>())
                {
                    continue;
                }

                // build the ray
                var dir = entity.GetComponent <TransformComponent>().WorldPosition - myTransform.WorldPosition;
                var ray = new Ray(myTransform.WorldPosition, dir.Normalized);

                // cast the ray
                var result = _physMan.IntersectRay(ray, maxRayLen);

                // add to visible list
                if (result.HitEntity == entity)
                {
                    _workList.Add(entity);
                }
            }

            // get closest entity in list
            var closestEnt = GetClosest(myTransform.WorldPosition, _workList);

            // return closest
            return(closestEnt);
        }