Object* WorldManager::getNearestTerminal(PlayerObject* player, TangibleType terminalType, float searchrange) { //this will get the nearest terminal in the world - we need to check playerbuildings, too ObjectSet inRangeObjects; this->getSI()->getObjectsInRange(player,&inRangeObjects,(ObjType_Tangible|ObjType_Building),searchrange);//range is debateable ObjectSet::iterator it = inRangeObjects.begin(); float range = 0.0; Object* nearestTerminal = NULL; while(it != inRangeObjects.end()) { Terminal* terminal = dynamic_cast<Terminal*> (*it); if(terminal&&(terminal->getTangibleType() == terminalType)) { float nr = glm::distance(terminal->mPosition, player->mPosition); //double check the distance if((nearestTerminal && (nr < range ))||(!nearestTerminal)) { range = nr; nearestTerminal = terminal; } } else if(BuildingObject* building = dynamic_cast<BuildingObject*> (*it)) { //iterate through the structure and look for terminals ObjectList list = building->getAllCellChilds(); ObjectList::iterator cellChildsIt = list.begin(); while(cellChildsIt != list.end()) { Object* cellChild = (*cellChildsIt); uint32 tmpType = cellChild->getType(); if((tmpType & ObjType_Tangible) == static_cast<uint32>(ObjType_Tangible)) { Terminal* terminal = dynamic_cast<Terminal*> (cellChild); if(terminal&&(terminal->getTangibleType() == terminalType)) { float nr = glm::distance(terminal->mPosition, player->mPosition); //double check the distance if((nearestTerminal && (nr < range))||(!nearestTerminal)) { range = nr; nearestTerminal = terminal; } } } ++cellChildsIt; } } ++it; } return nearestTerminal; }
void TerminalFactory::handleDatabaseJobComplete(void* ref,DatabaseResult* result) { QueryContainerBase* asyncContainer = reinterpret_cast<QueryContainerBase*>(ref); switch(asyncContainer->mQueryType) { case TFQuery_MainData: { Terminal* terminal = _createTerminal(result); if(terminal->getLoadState() == LoadState_Loaded && asyncContainer->mOfCallback) asyncContainer->mOfCallback->handleObjectReady(terminal,asyncContainer->mClient); else { switch(terminal->getTangibleType()) { case TanType_ElevatorTerminal: case TanType_ElevatorUpTerminal: case TanType_ElevatorDownTerminal: { ElevatorTerminal* elTerminal = dynamic_cast<ElevatorTerminal*>(terminal); switch(elTerminal->mLoadState) { case LoadState_Tangible_Data: { QueryContainerBase* asContainer = new(mQueryContainerPool.ordered_malloc()) QueryContainerBase(asyncContainer->mOfCallback,TFQuery_ElevatorData,asyncContainer->mClient); asContainer->mObject = elTerminal; mDatabase->ExecuteSqlAsync(this,asContainer,"SELECT * FROM terminal_elevator_data WHERE id=%"PRIu64" ORDER BY direction", elTerminal->getId()); } break; default: break; } } break; default: break; } } } break; case TFQuery_ElevatorData: { ElevatorTerminal* terminal = dynamic_cast<ElevatorTerminal*>(asyncContainer->mObject); //uint64 count = result->getRowCount(); //assert(count < 3 && count > 0); // we order by direction in select, though up is first if(terminal->mTanType == TanType_ElevatorUpTerminal || terminal->mTanType == TanType_ElevatorTerminal) result->GetNextRow(mElevetorDataUpBinding, (void*)terminal); if(terminal->mTanType == TanType_ElevatorDownTerminal || terminal->mTanType == TanType_ElevatorTerminal) result->GetNextRow(mElevetorDataDownBinding, (void*)terminal); terminal->setLoadState(LoadState_Loaded); asyncContainer->mOfCallback->handleObjectReady(terminal, asyncContainer->mClient); } break; default: break; } mQueryContainerPool.free(asyncContainer); }