private TreeStatusEnum KeepExistingTarget() { if (!_turret.hasAttackTarget) { return(TreeStatusEnum.FAILURE); } if (!_turret.isAutoAttacking) { return(TreeStatusEnum.SUCCESS); } GameEntity target = _game.GetEntityWithID(_turret.attackTarget.targetID); //target still alive? if (target == null) { return(TreeStatusEnum.FAILURE); } if (target.health.value < 0) { return(TreeStatusEnum.FAILURE); } if (target.isKilled) { return(TreeStatusEnum.FAILURE); } //out of range? int distance = _grid.DistanceBetween(_turret.location.cell, target.location.cell); if (distance > _turret.weapon.range) { return(TreeStatusEnum.FAILURE); } return(TreeStatusEnum.SUCCESS); }
void IExecuteSystem.Execute() { foreach (var unit in _attackingUnits.GetEntities()) { GameEntity attackTarget = _game.GetEntityWithID(unit.attackTarget.targetID); if (attackTarget == null) { unit.RemoveAttackTarget(); continue; //no more attacking; continue with next unit } //no friendly fire if (unit.team.value == attackTarget.team.value) { unit.RemoveAttackTarget(); continue; } int nrCells = _grid.DistanceBetween(unit.location.cell, attackTarget.location.cell); //out of range; don't shoot if (nrCells > unit.weapon.range) { continue; } //not aimed; don't shoot //if (!unit.isWeaponAimed) continue; // => this is enforced using GameMatcher //still reloading; don't shoot if (unit.hasFireWeapon && (unit.fireWeapon.time + 1 / unit.weapon.rateOfFire) > Time.time) { continue; } //we got here, we're ready to shoot unit.ReplaceFireWeapon(Time.time); } }