//--------------------------------------------------------------
//				CFaunaBotDescription ::callback()  
//--------------------------------------------------------------
void CFaunaBotDescriptionImp::callback(const string &, NLNET::TServiceId sid)
{
	H_AUTO(CFaunaBotDescriptionImpCallback);

	if ( Bots.size() != GrpAlias.size() )
	{
		nlwarning("<CFaunaBotDescription callback> the two vectors do not have the same size!");
	}
	// for each bot, set its new group alias
	for ( uint i = 0; i < Bots.size(); i++ )
	{
		CCreature * c = CreatureManager.getCreature( Bots[i] );
		if ( c )
		{
			c->setAIGroupAlias( GrpAlias[i] );
		}
		else
		{
			CreatureManager.addUnaffectedFaunaGroup(  Bots[i], GrpAlias[i] ) ;
		}
	}
}
//--------------------------------------------------------------
//				CNpcBotDescription ::callback()  
//--------------------------------------------------------------
//void CNpcBotDescriptionImp::callback(const string &serviceName, uint8 sid)
void CGenNpcDescMsgImp::callback (const std::string &serviceName, NLNET::TServiceId sid)
{
	H_AUTO(CGenNpcDescMsgImp_callback );
	
	if ( ! Mirror.mirrorIsReady() )
	{
		nlwarning("<CNpcBotDescriptionImp::callback> Received from %s service but mirror not yet ready", serviceName.c_str() );
		return;
	}
	CEntityId	Eid= getEntityIdFromRow(_EntityIndex);
	if ( Eid.isUnknownId() )
	{
		nlwarning( "Received CNpcBotDescription with E%u that has no entity id, skipping it", _EntityIndex.getIndex() );
		nldebug( "Reason: %s", TheDataset.explainIsAccessible(_EntityIndex).c_str() );
#ifdef NL_DEBUG
//		nlstop;
#endif
		return;
	}
	CCreature *creature = CreatureManager.getCreature( Eid );
	if( creature == 0 )
	{
		creature = new CCreature();
		if ( creature )
		{
			creature->setAIGroupAlias( _GrpAlias );
			creature->setUserModelId(_UserModelId);
			creature->setCustomLootTableId(_CustomLootTableId);
			creature->setPrimAlias(_PrimAlias);
			if ( _GrpAlias != CAIAliasTranslator::Invalid )
			{
				CreatureManager.addNpcToGroup( _GrpAlias, _Alias ); // called every time the callback is received
			}
			creature->setId(Eid);
			creature->mirrorizeEntityState( false,	_EntityIndex ); // import the position
			creature->addPropertiesToMirror( _EntityIndex, false ); // init properties + import the sheetid from the mirror
			creature->setServerSheet();

			if( creature->getType() == CSheetId::Unknown )
			{
				nlwarning("<CNpcBotDescriptionImp::callback> Npc Eid %s GrpAlias %s Alias %s have invalide sheet, not spawned in EGS", 
					Eid.toString().c_str(), 
					CPrimitivesParser::aliasToString(_GrpAlias).c_str(), 
					CPrimitivesParser::aliasToString(_Alias).c_str() );
				delete creature;
				return;
			}
			else
			{
				creature->loadSheetCreature( _EntityIndex );
				
				//if the creature has a user model and if the user model's script contains parse errors, change
				//the creature's name to <usermodelId:ERROR> 
				if (_UserModelId != "" && CDynamicSheetManager::getInstance()->scriptErrors(_PrimAlias, _UserModelId) == true)
				{
					TDataSetRow row = creature->getEntityRowId();
					ucstring name;
					name.fromUtf8("<"+ _UserModelId + ":ERROR>");
					NLNET::CMessage	msgout("CHARACTER_NAME");
					msgout.serial(row);
					msgout.serial(name);
					sendMessageViaMirror("IOS", msgout);
				}
				CreatureManager.addCreature( Eid, creature );

				// set the items
				creature->setItems( _RightHandItem, _RightHandItemQuality, _LeftHandItem, _LeftHandItemQuality );
			}
		}
	}
//	else
//		CreatureManager.addUnaffectedDescription( *this );

	if (creature != NULL)
	{
		if (!creature->getCustomLootTableId().empty())
		{
			creature->getContextualProperty().directAccessForStructMembers().lootable(true);
		}
		creature->setBotDescription( *this );
		CAIAliasTranslator::getInstance()->updateAssociation(_Alias,Eid);

		if (_BuildingBot)
			COutpostManager::getInstance().onBuildingSpawned(creature);
	}
}