From 7c10bff0e8d0e702237cd639ca9f30f7c65654d2 Mon Sep 17 00:00:00 2001 From: Fx-Doo Date: Sat, 19 Jul 2025 13:02:48 +0200 Subject: [PATCH 1/5] Add function and register last frames --- rts/Sim/Units/Unit.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rts/Sim/Units/Unit.h b/rts/Sim/Units/Unit.h index ea36dd60b3c..b1ce2d99bde 100644 --- a/rts/Sim/Units/Unit.h +++ b/rts/Sim/Units/Unit.h @@ -105,6 +105,9 @@ class CUnit : public CSolidObject // negative amount=reclaim, return= true -> build power was successfully applied bool AddBuildPower(CUnit* builder, float amount); + + // FindRepairTarget/FindRepairTargetAndRepair functions will ignore units that return false here + bool AllowUnitAutoRepair(); virtual void Activate(); virtual void Deactivate(); @@ -370,6 +373,8 @@ class CUnit : public CSolidObject // if we arent built on for a while start decaying int lastNanoAdd = 0; + int lastOwnerReclaim = 0; + int lastOwnerBuildRepair = 0; int lastFlareDrop = 0; // id of transport that the unit is about to be {un}loaded by From 4bf604dc258f693348d8ac29debae1cab76b36c3 Mon Sep 17 00:00:00 2001 From: Fx-Doo Date: Sat, 19 Jul 2025 13:11:04 +0200 Subject: [PATCH 2/5] Create the function and register the frames --- rts/Sim/Units/Unit.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/rts/Sim/Units/Unit.cpp b/rts/Sim/Units/Unit.cpp index e7b696f3bec..30e7f4feeec 100644 --- a/rts/Sim/Units/Unit.cpp +++ b/rts/Sim/Units/Unit.cpp @@ -1974,6 +1974,23 @@ void CUnit::TurnIntoNanoframe() eventHandler.UnitReverseBuilt(this); } +bool Cunit::AllowUnitAutoRepair() +{ + if ((this->lastOwnerReclaim) >= (gs->frameNum + 900)) + { + return true; + } + else + { + if ((this->lastOwnerReclaim) <= (this->lastOwnerBuildRepair)) + { + return true; + } + } + return false; +} + + bool CUnit::AddBuildPower(CUnit* builder, float amount) { RECOIL_DETAILED_TRACY_ZONE; @@ -1982,10 +1999,14 @@ bool CUnit::AddBuildPower(CUnit* builder, float amount) // stop decaying on building AND reclaim lastNanoAdd = gs->frameNum; - + CTeam* builderTeam = teamHandler.Team(builder->team); if (amount >= 0.0f) { + // Register attempt to build/repair by owner + if (builder->team)==(this->team) + lastOwnerBuildRepair = gs->frameNum; + // build or repair if (!beingBuilt && (health >= maxHealth)) return false; @@ -2013,7 +2034,6 @@ bool CUnit::AddBuildPower(CUnit* builder, float amount) if (buildProgress >= 1.0f) FinishedBuilding(false); } - return true; } else if (health < maxHealth) { @@ -2043,6 +2063,8 @@ bool CUnit::AddBuildPower(CUnit* builder, float amount) } } else { // reclaim + if (builder->team)==(this->team) + lastOwnerBuildReclaim = gs->frameNum; if (!AllowedReclaim(builder)) { builder->DependentDied(this); return false; From 16f2997b0879a2a6a43d14d8896be2b61a674424 Mon Sep 17 00:00:00 2001 From: Fx-Doo Date: Sat, 19 Jul 2025 13:13:57 +0200 Subject: [PATCH 3/5] Update BuilderCAI.cpp --- rts/Sim/Units/CommandAI/BuilderCAI.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rts/Sim/Units/CommandAI/BuilderCAI.cpp b/rts/Sim/Units/CommandAI/BuilderCAI.cpp index cfc1574cb60..90e0c4fd2fa 100644 --- a/rts/Sim/Units/CommandAI/BuilderCAI.cpp +++ b/rts/Sim/Units/CommandAI/BuilderCAI.cpp @@ -1639,8 +1639,13 @@ bool CBuilderCAI::FindRepairTargetAndRepair( bool stationary = false; for (const CUnit* unit: *qfQuery.units) { + if (teamHandler.Ally(owner->allyteam, unit->allyteam)) { if (!haveEnemy && (unit->health < unit->maxHealth)) { + // Don't auto pick for repair or build if within 900 frames of last reclaim + if (unit->AllowUnitAutoRepair()) + continue; + // don't help allies build unless set on roam if (unit->beingBuilt && owner->team != unit->team && (owner->moveState != MOVESTATE_ROAM)) continue; From aa3b5c60975e9e9321f07df1696286460930d400 Mon Sep 17 00:00:00 2001 From: Fx-Doo Date: Sun, 20 Jul 2025 10:25:39 +0200 Subject: [PATCH 4/5] Fix typo --- rts/Sim/Units/Unit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rts/Sim/Units/Unit.cpp b/rts/Sim/Units/Unit.cpp index 30e7f4feeec..48232d3737c 100644 --- a/rts/Sim/Units/Unit.cpp +++ b/rts/Sim/Units/Unit.cpp @@ -1974,7 +1974,7 @@ void CUnit::TurnIntoNanoframe() eventHandler.UnitReverseBuilt(this); } -bool Cunit::AllowUnitAutoRepair() +bool CUnit::AllowUnitAutoRepair() { if ((this->lastOwnerReclaim) >= (gs->frameNum + 900)) { From f996c6bfcee72c8213bc8d1386cab9af05f931e2 Mon Sep 17 00:00:00 2001 From: Fx-Doo Date: Sun, 20 Jul 2025 12:23:35 +0200 Subject: [PATCH 5/5] Various logic and typo fixes --- rts/Sim/Units/CommandAI/BuilderCAI.cpp | 2 +- rts/Sim/Units/Unit.cpp | 12 +++++++----- rts/Sim/Units/Unit.h | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/rts/Sim/Units/CommandAI/BuilderCAI.cpp b/rts/Sim/Units/CommandAI/BuilderCAI.cpp index 90e0c4fd2fa..42cdcd8254f 100644 --- a/rts/Sim/Units/CommandAI/BuilderCAI.cpp +++ b/rts/Sim/Units/CommandAI/BuilderCAI.cpp @@ -1643,7 +1643,7 @@ bool CBuilderCAI::FindRepairTargetAndRepair( if (teamHandler.Ally(owner->allyteam, unit->allyteam)) { if (!haveEnemy && (unit->health < unit->maxHealth)) { // Don't auto pick for repair or build if within 900 frames of last reclaim - if (unit->AllowUnitAutoRepair()) + if (!unit->AllowUnitAutoRepair()) continue; // don't help allies build unless set on roam diff --git a/rts/Sim/Units/Unit.cpp b/rts/Sim/Units/Unit.cpp index a7e6863e751..e1e93865bfe 100644 --- a/rts/Sim/Units/Unit.cpp +++ b/rts/Sim/Units/Unit.cpp @@ -1974,8 +1974,10 @@ void CUnit::TurnIntoNanoframe() } bool CUnit::AllowUnitAutoRepair() -{ - if ((this->lastOwnerReclaim) >= (gs->frameNum + 900)) +const { + if (this->lastOwnerReclaim == 0) return true; + + if ((gs->frameNum) >= (this->lastOwnerReclaim + 900)) { return true; } @@ -2003,7 +2005,7 @@ bool CUnit::AddBuildPower(CUnit* builder, float amount) if (amount >= 0.0f) { // Register attempt to build/repair by owner - if (builder->team)==(this->team) + if ((builder->team)==(this->team)) lastOwnerBuildRepair = gs->frameNum; // build or repair @@ -2062,8 +2064,8 @@ bool CUnit::AddBuildPower(CUnit* builder, float amount) } } else { // reclaim - if (builder->team)==(this->team) - lastOwnerBuildReclaim = gs->frameNum; + if ((builder->team)==(this->team)) + lastOwnerReclaim = gs->frameNum; if (!AllowedReclaim(builder)) { builder->DependentDied(this); return false; diff --git a/rts/Sim/Units/Unit.h b/rts/Sim/Units/Unit.h index b1ce2d99bde..c2c3b58ff09 100644 --- a/rts/Sim/Units/Unit.h +++ b/rts/Sim/Units/Unit.h @@ -107,7 +107,7 @@ class CUnit : public CSolidObject bool AddBuildPower(CUnit* builder, float amount); // FindRepairTarget/FindRepairTargetAndRepair functions will ignore units that return false here - bool AllowUnitAutoRepair(); + bool AllowUnitAutoRepair() const; virtual void Activate(); virtual void Deactivate();