//---------------------------------------------------------------------------------------------- void TrainAction::HandleMessage(RtsGame& game, Message* pMsg, bool& consumed) { if (PlanStepEx::State() == ESTATE_Executing && pMsg->MessageTypeID() == MSG_EntityCreate) { EntityCreateMessage* pEntityMsg = static_cast<EntityCreateMessage*>(pMsg); _ASSERTE(pEntityMsg && pEntityMsg->Data()); if (pEntityMsg->Data()->OwnerId != PLAYER_Self) return; TID entityId = pEntityMsg->Data()->EntityId; GameEntity *pEntity = game.Self()->GetEntity(entityId); _ASSERTE(pEntity); // We are interested only in free trainees that have not been locked before if (!m_trainStarted && m_traineeId == INVALID_TID && pEntity->Type() == _params[PARAM_EntityClassId] && !pEntity->IsLocked()) { // Check if the trainer is training that entity GameEntity* pTrainer = game.Self()->GetEntity(m_trainerId); _ASSERTE(pTrainer); if (pTrainer->IsTraining(entityId)) { m_trainStarted = true; m_traineeId = entityId; m_pTrainee = pEntity; // Lock that trainee and bound it to this action because if we don't // other ready actions in the same update cycle will receive the same message // and they may bind to the same trainee pEntity->Lock(this); consumed = true; LogInfo("Action %s has bound trainee=%d to trainer=%d", ToString().c_str(), m_traineeId, m_trainerId); } } } }