Ticket #831: checkTargetAngle.diff
File checkTargetAngle.diff, 1.6 KB (added by , 13 years ago) |
---|
-
binaries/data/mods/public/simulation/components/UnitAI.js
617 617 if (this.TargetIsAlive(this.order.data.target)) 618 618 { 619 619 // 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)) 621 621 { 622 622 var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack); 623 623 cmpAttack.PerformAttack(this.attackType, this.order.data.target); … … 1813 1813 return cmpUnitMotion.IsInTargetRange(target, range.min, range.max); 1814 1814 }; 1815 1815 1816 UnitAI.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 1816 1832 UnitAI.prototype.GetBestAttack = function() 1817 1833 { 1818 1834 var cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);