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;
}
Example #2
0
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);
}