Ticket #831: checkTargetAngle.diff

File checkTargetAngle.diff, 1.6 KB (added by Badmadblacksad, 13 years ago)
  • binaries/data/mods/public/simulation/components/UnitAI.js

     
    617617                    if (this.TargetIsAlive(this.order.data.target))
    618618                    {
    619619                        // Check we can still reach the target
    620                         if (this.CheckTargetRange(this.order.data.target, IID_Attack, this.attackType))
     620                        if (this.CheckTargetRange(this.order.data.target, IID_Attack, this.attackType) && this.CheckTargetAngle(this.order.data.target))
    621621                        {
    622622                            var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
    623623                            cmpAttack.PerformAttack(this.attackType, this.order.data.target);
     
    18131813    return cmpUnitMotion.IsInTargetRange(target, range.min, range.max);
    18141814};
    18151815
     1816UnitAI.prototype.CheckTargetAngle = function(target)
     1817{
     1818    var cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
     1819    if (!cmpPosition || !cmpPosition.IsInWorld())
     1820        return false;
     1821    var cmpTargetPosition = Engine.QueryInterface(target, IID_Position);
     1822    if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
     1823        return false;
     1824    var pos = cmpPosition.GetPosition();
     1825    var targetpos = cmpTargetPosition.GetPosition();
     1826    var angle = Math.atan2(targetpos.x - pos.x, targetpos.z - pos.z);
     1827    var rot = cmpPosition.GetRotation();
     1828    var delta = (rot.y - angle + Math.PI) % (2 * Math.PI) - Math.PI;
     1829    return Math.abs(delta) < 0.2;
     1830};
     1831
    18161832UnitAI.prototype.GetBestAttack = function()
    18171833{
    18181834    var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);