//----------------------------------------------------------------------------
void CGuildMemberModule::quitGuild()
{
	MODULE_AST( _GuildMemberCore );
	CGuild * guild = EGS_PD_CAST<CGuild*>( _GuildMemberCore->getGuild() );
	EGS_PD_AST( guild );
	SM_STATIC_PARAMS_1( params,STRING_MANAGER::player );
	params[0].setEIdAIAlias( _GuildMemberCore->getIngameEId(), CAIAliasTranslator::getInstance()->getAIAlias(_GuildMemberCore->getIngameEId()) );
	
	CFameManager::getInstance().clearPlayerGuild( _GuildMemberCore->getIngameEId() );

	CGuildCharProxy proxy;
	getProxy(proxy);
	proxy.cancelAFK();
	clearOnlineGuildProperties();
	guild->deleteMember( _GuildMemberCore );
	if ( guild->getMembersBegin() == guild->getMembersEnd() )
	{
		CGuildManager::getInstance()->deleteGuild(guild->getId());
		proxy.sendSystemMessage("GUILD_DESTROYED");
	}
	else
	{
		guild->sendMessageToGuildMembers("GUILD_QUIT", params);
		SM_STATIC_PARAMS_1(params, STRING_MANAGER::string_id);
		params[0].StringId = guild->getNameId();
		proxy.sendSystemMessage("GUILD_YOU_QUIT", params);
	}
}
//----------------------------------------------------------------------------
void CGuildMemberModule::setGrade( uint16 index,uint8 session, EGSPD::CGuildGrade::TGuildGrade grade)const
{
	MODULE_AST( _GuildMemberCore );
	CGuild * guild = EGS_PD_CAST<CGuild*>(_GuildMemberCore->getGuild());
	EGS_PD_AST( guild );
	CGuildCharProxy proxy;
	getProxy(proxy);
	proxy.cancelAFK();
		
	if ( guild->getMembersSession() != session )
	{
		proxy.sendSystemMessage( "GUILD_BAD_SESSION" );
		return;
	}
	if ( _GuildMemberCore->getMemberIndex() == index )
	{
		nlwarning("<GUILD>%s tries to change its grade",proxy.getId().toString().c_str());
		return;
	}
	CGuildMember * member = guild->getMemberByIndex( index );
	if ( member == NULL )
	{
		nlwarning("<GUILD>%s set invalid member idx %u as leader",proxy.getId().toString().c_str(),index );
		return;
	}
	EGSPD::CGuildGrade::TGuildGrade oldGrade = member->getGrade();
	if ( !canAffectGrade( oldGrade ) )
	{
		proxy.sendSystemMessage("GUILD_INSUFFICIENT_GRADE");
		return;
	}

	if ( !CGuildManager::getInstance()->isGMGuild( guild->getId() ) && guild->getGradeCount(grade) >= guild->getMaxGradeCount(grade) )
	{
		SM_STATIC_PARAMS_1( paramFull, STRING_MANAGER::string_id );
		paramFull[0].StringId = CEntityIdTranslator::getInstance()->getEntityNameStringId(member->getIngameEId());
		proxy.sendSystemMessage("GUILD_GRADE_FULL",paramFull);
		return;
	}
	
	member->setMemberGrade(grade);
	guild->incGradeCount( grade );
	guild->decGradeCount( oldGrade );
	
	// send system message
	SM_STATIC_PARAMS_3(params,STRING_MANAGER::player,STRING_MANAGER::player,STRING_MANAGER::string_id);
	params[0].setEIdAIAlias( proxy.getId(), CAIAliasTranslator::getInstance()->getAIAlias(proxy.getId()) );
	params[1].setEIdAIAlias( member->getIngameEId(), CAIAliasTranslator::getInstance()->getAIAlias(member->getIngameEId()) );
	params[2].StringId = guild->getNameId();
	
	// If the player is online, the module must be recreated. Do as the reference was destroyed
	CGuildMemberModule * module = NULL;
	if ( member->getReferencingModule(module) )
	{
		CGuildCharProxy targetProxy;
		module->getProxy(targetProxy);
		member->removeReferencingModule(module);
		module->onReferencedDestruction();
		IModule * moduleTarget = createModule(targetProxy,member);
		guild->setMemberClientDB( member );
		MODULE_AST(moduleTarget);
	}
}