//------------------------------------------------------------------------------ // newModelEntry() -- Generates a new model entry for this player. // Returns a pointer to the new entry, else zero(0) //------------------------------------------------------------------------------ OtwModel* Otw::newModelEntry(models::Player* const ip) { OtwModel* model = nullptr; // Only if we have a player pointer ... if (ip != nullptr && (getModelTableSize() < getMaxModels())) { // Create a model entry for this player model = modelFactory(); if (model != nullptr) { // Yes, initialize the model entry model->initialize(ip, otwModelTypes.data(), nOtwModelTypes); addModelToList(model, MODEL_TABLE); } } return model; }
//------------------------------------------------------------------------------ // mapPlayerList2ModelTable() - Map the player list to the model table // // model states are: // INACTIVE -- unused model entry // ACTIVE -- player is alive and in-range // DEAD -- player is dead or destoryed // OUT_OF_RANGE -- player is alive but out of range // // Note: this routines will set model entries to DEAD and OUT_OF_RANGE, but the // derived class should handle the visual system unique termination sequences and // clear the model entry. //------------------------------------------------------------------------------ void Otw::mapPlayerList2ModelTable() { // --- // Check for reset // --- if (isResetInProgress()) { // Set all active models as Out-Of-Range so that sendOwnshipAndModels() can remove them for (unsigned int i = 0; i < getModelTableSize(); i++) { modelTbl[i]->setState( OtwModel::OUT_OF_RANGE ); } return; } // --- // Remove all inactive, dead or out-of-range models // -- These states were issued last pass, so the OTW system // specific software should have handled them by now. // -- As models are removed, the table above the model is shifted down. // -- We're also clearing the model's 'checked' flag // --- for (int i = getModelTableSize(); i > 0; --i) { if ( modelTbl[i-1]->isState(OtwModel::CLEARED) ) { // Deleting this model //std::cout << "Otw::mapPlayerList2ModelTable() cleanup: model = " << modelTbl[i] << std::endl; removeModelFromList( (i-1), MODEL_TABLE); } } for (unsigned int i = 0; i < getModelTableSize(); i++) { modelTbl[i]->setCheckedFlag(false); } if (playerList != 0) { // We must have a player list ... // --- // Find players that are alive and within range of the visual system ... // --- Basic::List::Item* item = playerList->getFirstItem(); while (item != 0) { // Get a pointer to the player, 'p' Basic::Pair* pair = dynamic_cast<Basic::Pair*>(item->getValue()); Player* p = (Player*) pair->object(); bool dummy = false; const Weapon* wpn = dynamic_cast<const Weapon*>( p ); if (wpn != 0) dummy = wpn->isDummy(); if ( p != getOwnship() && !dummy ) { // Find the player's model entry (if any) OtwModel* model = findModel(p, MODEL_TABLE); // Check if in-range bool inRange = computeRangeToPlayer(p) <= maxRange; // Check if this player is alive and within range. if (p->isActive() && inRange) { // When alive and in range ... if (model != 0) { // a) and it already has a model entry: make sure it's active ... model->setState( OtwModel::ACTIVE ); } else { // b) and it doesn't have a model entry (new, in-range player) ... model = newModelEntry(p); } } else if (p->isDead() && inRange) { // When player isn't alive and it had a model entry if (model != 0) { // set state to dead model->setState( OtwModel::DEAD ); } } else { // When player is out-of-range and it had a model entry if (model != 0) { // set state to out-of-range model->setState( OtwModel::OUT_OF_RANGE ); } } if (model != 0) model->setCheckedFlag(true); } item = item->getNext(); // Next player } } // --- // Any models not checked needs to be removed // --- for (unsigned int i = 0; i < getModelTableSize(); i++) { if ( modelTbl[i]->isNotChecked() ) { // Request removel; // (note: the OTW system specific code now has one frame to cleanup it's own code // before the model is dropped from the output list next frame -- see above) modelTbl[i]->setState( OtwModel::OUT_OF_RANGE ); } } }