diff --git a/rts/Lua/LuaSyncedCtrl.cpp b/rts/Lua/LuaSyncedCtrl.cpp index e2c9fcd54b5..c3f66d3a08f 100644 --- a/rts/Lua/LuaSyncedCtrl.cpp +++ b/rts/Lua/LuaSyncedCtrl.cpp @@ -1260,7 +1260,7 @@ int LuaSyncedCtrl::CreateUnit(lua_State* L) if (unit == nullptr) return 0; - unit->SetSoloBuilder(builder); + unit->SetSoloBuilder(builder, unitDef); lua_pushnumber(L, unit->id); return 1; diff --git a/rts/Sim/Units/Unit.cpp b/rts/Sim/Units/Unit.cpp index fff58bfa77a..1789f7c1714 100644 --- a/rts/Sim/Units/Unit.cpp +++ b/rts/Sim/Units/Unit.cpp @@ -1770,15 +1770,15 @@ void CUnit::DropCurrentAttackTarget() } -void CUnit::SetSoloBuilder(CUnit* builder) +bool CUnit::SetSoloBuilder(CUnit* builder, const UnitDef* buildeeDef) { if (builder == nullptr) - return; - if (unitDef->canBeAssisted) - return; + return false; + if (buildeeDef->canBeAssisted) + return false; - soloBuilder = builder; - AddDeathDependence(builder, DEPENDENCE_BUILDER); + AddDeathDependence(soloBuilder = builder, DEPENDENCE_BUILDER); + return true; } void CUnit::SetLastAttacker(CUnit* attacker) diff --git a/rts/Sim/Units/Unit.h b/rts/Sim/Units/Unit.h index 98b3664cfc4..db0e67324de 100644 --- a/rts/Sim/Units/Unit.h +++ b/rts/Sim/Units/Unit.h @@ -198,7 +198,7 @@ class CUnit : public CSolidObject int piece; }; - void SetSoloBuilder(CUnit* builder); + bool SetSoloBuilder(CUnit* builder, const UnitDef* buildeeDef); void SetLastAttacker(CUnit* attacker); void SetTransporter(CUnit* trans) { transporter = trans; } diff --git a/rts/Sim/Units/UnitTypes/Builder.cpp b/rts/Sim/Units/UnitTypes/Builder.cpp index 696c62fd24e..e45c0815e5e 100644 --- a/rts/Sim/Units/UnitTypes/Builder.cpp +++ b/rts/Sim/Units/UnitTypes/Builder.cpp @@ -120,7 +120,7 @@ bool CBuilder::CanAssistUnit(const CUnit* u, const UnitDef* def) const if (!unitDef->canAssist) return false; - return ((def == nullptr || u->unitDef == def) && u->beingBuilt && (u->buildProgress < 1.0f) && (!u->soloBuilder || u->soloBuilder == this)); + return ((def == nullptr || u->unitDef == def) && u->beingBuilt && (u->buildProgress < 1.0f) && (u->soloBuilder == nullptr || u->soloBuilder == this)); } @@ -427,7 +427,7 @@ bool CBuilder::UpdateResurrect(const Command& fCommand) CUnit* resurrectee = unitLoader->LoadUnit(resurrecteeParams); assert(resurrecteeDef == resurrectee->unitDef); - resurrectee->SetSoloBuilder(this); + resurrectee->SetSoloBuilder(this, resurrecteeDef); // TODO: make configurable if this should happen resurrectee->health *= 0.05f; @@ -780,7 +780,10 @@ bool CBuilder::StartBuild(BuildInfo& buildInfo, CFeature*& feature, bool& waitSt terraformCenter = buildee->pos; } - buildee->SetSoloBuilder(this); + // pass the *builder*'s udef for checking canBeAssisted; if buildee + // happens to be a non-assistable factory then it would also become + // impossible to *construct* with multiple builders + buildee->SetSoloBuilder(this, this->unitDef); AddDeathDependence(curBuild = buildee, DEPENDENCE_BUILD); // if the ground is not going to be terraformed the buildee would