float GetNearestMonster( SpriteSeer* pRole )
{
    float fret = 0.0f;
    SpriteMonster* pRet = NULL;

    float minDis = 100000.0f;

    minDis *= minDis;

    const map<int, SpriteMonster*>& allMonster = SpriteMonsterMgr::Get()->GetAllMonster();
    for(map<int, SpriteMonster*>::const_iterator iter = allMonster.begin(); iter != allMonster.end(); iter++)
    {
        float dis = ccpDistanceSQ(iter->second->getPosition(), pRole->getPosition());
        if( dis <= minDis)
        {
            pRet = iter->second;
            minDis = dis;

        }
    }

    if(pRet)
    {
        fret = ccpDistance(pRet->getPosition(), pRole->getPosition());
    }
    return fret;
}
//----------------------------------------------------------------------------------------
//			others function means other players'
//----------------------------------------------------------------------------------------
void BaseLevelBuilder::addMonster(MonsterInitInfo info)
{
	std::map<uint32_t, SpriteMonster*>::iterator itor = m_level->m_MonsterInfo.find(info.uid);
	if (itor == m_level->m_MonsterInfo.end())
	{
		//add monster
		ASSERT(m_level->m_levelDataReference->mapFilePointer != NULL, "map file is empty");
		SpriteMonster* monster = LevelObjectCreator::sCreateSpriteMonster(info);

		monster->SetID(info.uid);
		monster->setTag(MAP_TAG_MONSTER);
		monster->setPosition(info.pos);

		//printf("addMonster %f, %f\n", info.pos.x, info.pos.y);

		//添加阴影
		/*ASprite* pAsprite = AspriteManager::getInstance()->getAsprite("spriteBin/shadow.bin");
		if(pAsprite != NULL)
		{
			CCPoint cp;
			CCSprite* pCSprite = pAsprite->getSpriteFromFrame(0, 0, cp);
			if(pCSprite != NULL)
			{
				pCSprite->setPosition(ccp(0, 0));
				pCSprite->setTag(SHADOW_TAG);
				monster->addChildToRoot(pCSprite);
			}
		}*/

		CATLObjectLayer* pObjLayer = dynamic_cast<CATLObjectLayer*>(m_level->m_pObjectsLayer);
		if(pObjLayer)
		{
			pObjLayer->AddRoleShadow(monster);
		}

		//为精英怪添加特效
		if(info.isElite)
		{
			EffectSprite * eliteEffect = ParticleManager::Get()->createEffectSprite(206,"");
			eliteEffect->SetAnim(kType_Play, 1, true);
			eliteEffect->setTag(ELITE_TAG);
			monster->addChildToRoot(eliteEffect);
		}

		if (m_level->m_pObjectsLayer)
		{
			m_level->m_pObjectsLayer->addChild(monster, LevelLayer::sCalcZorder(monster->getPosition()));			
		}

		m_level->m_MonsterInfo.insert(std::pair<uint32_t, SpriteMonster*>(info.uid, monster));
	}
	else
	{
		CCLog("error, the player has add before");
	}
}
SpriteMonster * SpriteMonsterMgr::getNearestMonster()
{
	SpriteMonster * nearestMonster = NULL;
	float distance = 10000.0f;
	SpriteSeer * hero = GameManager::Get()->getHero();
	if (!hero || m_tabMonsters.size() == 0)
	{
		return NULL;
	}

	map<int, SpriteMonster*>::iterator it = m_tabMonsters.begin();

	SpriteMonster * firstMonster = it->second;

	//能被锁定的怪物才记入数据,隐身不计入
	if (firstMonster->getCanBeFocus() && !firstMonster->getIsAlliance())
	{
		distance = ccpDistance(firstMonster->getPosition(), hero->getPosition());
		nearestMonster = firstMonster;
	}	

	for(; it != m_tabMonsters.end(); it++ )
	{
		SpriteMonster* monster = it->second;
		if (!monster->getCanBeFocus() || monster->getIsAlliance())
		{
			continue;
		}

		float dis = ccpDistance(monster->getPosition(), hero->getPosition());
		if (dis < distance && monster->fsm_rule.IsRunning())
		{
			distance = dis;
			nearestMonster = monster;
		}	
	}

	return nearestMonster;
}
cocos2d::CCPoint ElfAimDirectionHandler::GetAimDirection()
{
	CCPoint ret = m_pElf->getDirectionVector();
	CCPoint rolePos = m_pElf->getPosition();

	
	if(LevelManager::sShareInstance()->isCurrentPVPLevel())
	{
		if(LevelManager::sShareInstance()->getCurrentLevelLayer())
		{
			float minDis = m_pSkill->longDistanceAttackRange;

			if(minDis <= 0.0f)
				minDis = 320.0f;

			minDis *= minDis;

			SpriteSeer* pNearestHero = NULL;

			std::map<unsigned int, OthersPlayerInfo>& otherPlayer = LevelManager::sShareInstance()->getCurrentLevelLayer()->m_othersPlayerInfo;

			for(std::map<unsigned int, OthersPlayerInfo>::const_iterator iter = otherPlayer.begin(); iter != otherPlayer.end(); iter++)
			{
				SpriteSeer* pOhterHero = iter->second.seer; 
				if(m_pRole == pOhterHero || pOhterHero == NULL)
					continue;

				float dis = ccpDistanceSQ(pOhterHero->getPosition(), m_pElf->getPosition());
				if( dis <= minDis)
				{
					pNearestHero = pOhterHero;
					minDis = dis;

				}
			}

			if(pNearestHero)
			{
				m_bAimMonster = true;
				m_nearestMonsterPos = pNearestHero->getPosition();
				ret = ccpSub(m_nearestMonsterPos, rolePos);
			}
		}
	}
	else
	{
		SpriteMonster* pNearestMonster = GetNearestMonster();

		if(pNearestMonster)
		{
			m_bAimMonster = true;
			m_nearestMonsterPos = pNearestMonster->getPosition();
			ret = ccpSub(m_nearestMonsterPos, rolePos);

		}
	}

	

	ret = ccpNormalize(ret);

	return ret;
}