void XAICUnitDGunControllerHandler::OnEvent(const XAIIEvent* e) { switch (e->type) { case XAI_EVENT_UNIT_FINISHED: { const XAIUnitFinishedEvent* ee = dynamic_cast<const XAIUnitFinishedEvent*>(e); const XAICUnit* unit = xaih->unitHandler->GetUnitByID(ee->unitID); const XAIUnitDef* uDef = unit->GetUnitDefPtr(); if (uDef->GetDGunWeaponDef() != 0) { AddController(ee->unitID); } } break; case XAI_EVENT_UNIT_DESTROYED: { const XAIUnitDestroyedEvent* ee = dynamic_cast<const XAIUnitDestroyedEvent*>(e); // silly to call for every destroyed unit, but // we can no longer retrieve the UnitDef here DelController(ee->unitID); } break; case XAI_EVENT_ENEMY_DESTROYED: { const XAIEnemyDestroyedEvent* ee = dynamic_cast<const XAIEnemyDestroyedEvent*>(e); std::map<int, XAICUnitDGunController*>::iterator it; for (it = controllers.begin(); it != controllers.end(); it++) { it->second->EnemyDestroyed(ee->attackerID, ee->unitID); } } break; case XAI_EVENT_UPDATE: { std::map<int, XAICUnitDGunController*>::iterator it; for (it = controllers.begin(); it != controllers.end(); it++) { it->second->Update(); } } break; default: { } break; } }
void CDGunControllerHandler::Update(int frame) { std::list<int> deadCons; std::list<int>::iterator deadConIt; std::map<int, CDGunController*>::iterator conIt; for (conIt = controllers.begin(); conIt != controllers.end(); conIt++) { const UnitDef* udef = ai->cb->GetUnitDef(conIt->first); if (udef == NULL || !udef->canDGun) { deadCons.push_back(conIt->first); } else { conIt->second->Update(frame); } } for (deadConIt = deadCons.begin(); deadConIt != deadCons.end(); deadConIt++) { // probably should tie this into [Notify]UnitDestroyed() DelController(*deadConIt); } }