190 {
191
192 if (!unit) {
193 return;
194 }
195
196 if (BWAPI::Broodwar->getFrameCount() % KITING_FRAME_DELAY != 0) {
197 return;
198 }
199
200
201 if (unit->getLastCommandFrame() >= BWAPI::Broodwar->getFrameCount()) {
202 return;
203 }
204
205
206 if (unit->isStartingAttack() || unit->isAttackFrame()) {
207 return;
208 }
209
210 if (unit->getGroundWeaponCooldown() == 0) {
211 BWAPI::Unit attackingUnit = nullptr;
212 if (unit->isUnderAttack()) {
213 BWAPI::Unitset enemies = unit->getLastAttackingPlayer()->getUnits();
214 for (const auto& enemyUnit : enemies) {
215 if (!enemyUnit->exists()) {
216 continue;
217 }
218
219 if (enemyUnit->getOrderTarget() == unit) {
220 attackingUnit = enemyUnit;
221 break;
222 }
223 }
224 }
225
226 if (attackingUnit != nullptr) {
227 unit->attack(attackingUnit);
228 }
229 else {
230 unit->attack(targetPos);
231 }
232 }
233 else {
234
235 constexpr int minDist = 150;
236 if (closestCP != BWAPI::Positions::Invalid && unit->getPosition().getApproxDistance(closestCP) < minDist) {
237 BWAPI::Broodwar->drawCircleMap(closestCP, minDist, BWAPI::Colors::Yellow);
238 unit->move(targetPos);
239 }
240 else {
241 unit->move(BWAPI::Position(BWAPI::Broodwar->self()->getStartLocation()));
242 }
243 }
244}