void CUnitHandler::UnitDestroyed(int unitID) { UnitCategory category = ai->ut->GetCategory(unitID); const UnitDef* unitDef = ai->cb->GetUnitDef(unitID); if (category != CAT_LAST) { assert(!ai->GetUnit(unitID)->isDead); ai->GetUnit(unitID)->isDead = true; AllUnitsByType[unitDef->id].remove(unitID); AllUnitsByCat[category].remove(unitID); IdleUnitRemove(unitID); BuildTaskRemove(unitID); if (category == CAT_DEFENCE) { ai->dm->RemoveDefense(ai->cb->GetUnitPos(unitID), unitDef); } if (category == CAT_MMAKER) { MMakerRemove(unitID); } if (category == CAT_FACTORY) { FactoryRemove(unitID); } if (category == CAT_BUILDER) { // remove the builder for (std::list<BuilderTracker*>::iterator i = BuilderTrackers.begin(); i != BuilderTrackers.end(); i++) { if ((*i)->builderID == unitID) { if ((*i)->buildTaskId) BuildTaskRemove(*i); if ((*i)->taskPlanId) TaskPlanRemove(*i); if ((*i)->factoryId) FactoryBuilderRemove(*i); BuilderTracker* builderTracker = *i; BuilderTrackers.erase(i); delete builderTracker; break; } } } if (category == CAT_MEX) { MetalExtractorRemove(unitID); } if (category == CAT_NUKE) { NukeSiloRemove(unitID); } } }
void CUnitHandler::UnitDestroyed(int unit) { int category = ai->ut->GetCategory(unit); const UnitDef* unitDef = ai->cb->GetUnitDef(unit); if(category != -1){ AllUnitsByType[unitDef->id]->remove(unit); AllUnitsByCat[category]->remove(unit); IdleUnitRemove(unit); BuildTaskRemove(unit); if(category == CAT_DEFENCE){ ai->dm->RemoveDefense(ai->cb->GetUnitPos(unit),unitDef); } if(category == CAT_MMAKER){ MMakerRemove(unit); } if(category == CAT_FACTORY) { FactoryRemove(unit); } if(category == CAT_BUILDER) { // Remove the builder for(list<BuilderTracker*>::iterator i = BuilderTrackers.begin(); i != BuilderTrackers.end(); i++){ if((*i)->builderID == unit) { if((*i)->buildTaskId) BuildTaskRemove(*i); if((*i)->taskPlanId) TaskPlanRemove(*i); if((*i)->factoryId) FactoryBuilderRemove(*i); BuilderTracker* builderTracker = *i; BuilderTrackers.erase(i); delete builderTracker; // Test this break; } } } } }