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 } }
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); }