Index: binaries/data/mods/public/simulation/components/UnitAI.js =================================================================== --- binaries/data/mods/public/simulation/components/UnitAI.js +++ binaries/data/mods/public/simulation/components/UnitAI.js @@ -4293,12 +4293,11 @@ if (!this.CheckTargetVisible(target) || this.IsTurret()) return false; - var cmpRanged = Engine.QueryInterface(this.entity, iid); - if (!cmpRanged) + let range = this.GetRange(iid, type); + if (!range) return false; - var range = cmpRanged.GetRange(type); - var cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion); + let cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion); return cmpUnitMotion.MoveToTargetRange(target, range.min, range.max); }; @@ -4327,8 +4326,9 @@ if (!this.CheckTargetVisible(target)) return false; - let cmpAttack = Engine.QueryInterface(this.entity, IID_Attack); - let range = cmpAttack.GetRange(type); + let range = this.GetRange(IID_Attack, type); + if (!range) + return false; let thisCmpPosition = Engine.QueryInterface(this.entity, IID_Position); if (!thisCmpPosition.IsInWorld()) @@ -4409,10 +4409,9 @@ UnitAI.prototype.CheckTargetRange = function(target, iid, type) { - var cmpRanged = Engine.QueryInterface(this.entity, iid); - if (!cmpRanged) + let range = this.GetRange(iid, type); + if (!range) return false; - var range = cmpRanged.GetRange(type); let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager); return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, range.max, false); @@ -4446,8 +4445,9 @@ if (!targetCmpPosition || !targetCmpPosition.IsInWorld()) return false; - let cmpAttack = Engine.QueryInterface(this.entity, IID_Attack); - let range = cmpAttack.GetRange(type); + let range = this.GetRange(IID_Attack, type); + if (!range) + return false; let thisCmpPosition = Engine.QueryInterface(this.entity, IID_Position); if (!thisCmpPosition.IsInWorld()) @@ -4576,20 +4576,19 @@ UnitAI.prototype.CheckTargetDistanceFromHeldPosition = function(target, iid, type) { - var cmpRanged = Engine.QueryInterface(this.entity, iid); - var range = iid !== IID_Attack ? cmpRanged.GetRange() : cmpRanged.GetRange(type); + let range = this.GetRange(iid, type); - var cmpPosition = Engine.QueryInterface(target, IID_Position); + let cmpPosition = Engine.QueryInterface(target, IID_Position); if (!cmpPosition || !cmpPosition.IsInWorld()) return false; - var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); - if (!cmpVision) + let visionRange = this.GetRange(IID_Vision); + if (!visionRange) return false; - var halfvision = cmpVision.GetRange() / 2; + let halfvision = visionRange / 2; - var pos = cmpPosition.GetPosition(); - var heldPosition = this.heldPosition; + let pos = cmpPosition.GetPosition(); + let heldPosition = this.heldPosition; if (heldPosition === undefined) heldPosition = { "x": pos.x, "z": pos.z }; @@ -4598,12 +4597,11 @@ UnitAI.prototype.CheckTargetIsInVisionRange = function(target) { - var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); - if (!cmpVision) + let range = this.GetRange(IID_Vision); + if (!range) return false; - var range = cmpVision.GetRange(); - var distance = DistanceBetweenEntities(this.entity, target); + let distance = DistanceBetweenEntities(this.entity, target); return distance < range; }; @@ -5621,45 +5619,41 @@ var ret = { "min": 0, "max": 0 }; if (this.GetStance().respondStandGround) { - var cmpRanged = Engine.QueryInterface(this.entity, iid); - if (!cmpRanged) + let range = this.GetRange(iid); + if (!range) return ret; - var range = iid !== IID_Attack ? cmpRanged.GetRange() : cmpRanged.GetFullAttackRange(); - var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); - if (!cmpVision) + let visionRange = this.GetRange(IID_Vision); + if (!visionRange) return ret; ret.min = range.min; - ret.max = Math.min(range.max, cmpVision.GetRange()); + ret.max = Math.min(range.max, visionRange); } else if (this.GetStance().respondChase) { - var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); - if (!cmpVision) + let visionRange = this.GetRange(IID_Vision); + if (!visionRange) return ret; - var range = cmpVision.GetRange(); - ret.max = range; + ret.max = visionRange; } else if (this.GetStance().respondHoldGround) { var cmpRanged = Engine.QueryInterface(this.entity, iid); if (!cmpRanged) return ret; - var range = iid !== IID_Attack ? cmpRanged.GetRange() : cmpRanged.GetFullAttackRange(); - var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); - if (!cmpVision) + let range = this.GetRange(iid); + let visionRange = this.GetRange(IID_Vision); + if (!visionRange) return ret; - var vision = cmpVision.GetRange(); - ret.max = Math.min(range.max + vision / 2, vision); + ret.max = Math.min(range.max + visionRange / 2, visionRange); } // We probably have stance 'passive' and we wouldn't have a range, // but as it is the default for healers we need to set it to something sane. else if (iid === IID_Heal) { - var cmpVision = Engine.QueryInterface(this.entity, IID_Vision); - if (!cmpVision) + let visionRange = this.GetRange(IID_Vision); + if (!visionRange) return ret; - var range = cmpVision.GetRange(); - ret.max = range; + ret.max = visionRange; } return ret; }; @@ -5743,6 +5737,17 @@ //// Helper functions //// +UnitAI.prototype.GetRange = function(iid, type) +{ + let cmpRanged = Engine.QueryInterface(this.entity, iid); + if (!cmpRanged) + return false; + + if (iid === IID_Attack) + return type ? cmpRanged.GetRange(type) : cmpRanged.GetFullAttackRange(); + return cmpRanged.GetRange(); +} + UnitAI.prototype.CanAttack = function(target) { // Formation controllers should always respond to commands