instead of it saying "You have gained experience" how about making it so it shows the exact xp you gain.  Its an easy fix.  I already tested it, and it works perfect.  Have not made the change for raid xp yet tho.  It may be better to make it a choice, like a rule in the database to show it with the actual xp or not, in case some rather it not show.  I also commented out the old messages rather than remove them incase of it not working correctly.
(the text in 
red is the changes I have made, its only about 3 or 4 lines, minor changes)
line 187-216 of exp.cpp
	Code:
	
SetEXP(add_exp, aaexp, resexp);
}
void Client::SetEXP(int32 add_exp, int32 set_aaxp, bool isrezzexp) {
	int32 set_exp = GetEXP() + add_exp;
	_log(CLIENT__EXP, "Attempting to Set Exp for %s (XP: %u, AAXP: %u, Rez: %s)", this->GetCleanName(), set_exp, set_aaxp, isrezzexp ? "true" : "false");
	//max_AAXP = GetEXPForLevel(52) - GetEXPForLevel(51);	//GetEXPForLevel() doesn't depend on class/race, just level, so it shouldn't change between Clients
	max_AAXP = RuleI(AA, ExpPerPoint);	//this may be redundant since we're doing this in Client::FinishConnState2()
	if (max_AAXP == 0 || GetEXPForLevel(GetLevel()) == 0xFFFFFFFF) {
		Message(13, "Error in Client::SetEXP. EXP not set.");
		return; // Must be invalid class/race
	}
	
	
	if ((set_exp + set_aaxp) > (m_pp.exp+m_pp.expAA)) {
		if (isrezzexp)
			this->Message_StringID(MT_Experience, REZ_REGAIN);
		else{
			if(this->IsGrouped())
				//this->Message_StringID(MT_Experience, GAIN_GROUPXP);
				int a=1;
			else if(IsRaidGrouped())
				Message_StringID(MT_Experience, GAIN_RAIDEXP);
			else
				//this->Message_StringID(MT_Experience, GAIN_XP);
				this->Message(15,"You have gained %u XP.", add_exp);
		}
	}
	else if((set_exp + set_aaxp) < (m_pp.exp+m_pp.expAA)){ //only loss message if you lose exp, no message if you gained/lost nothing.
		Message(15, "You have lost experience.");
 line 525-541 of exp.cpp
	Code:
	for (i = 0; i < MAX_GROUP_MEMBERS; i++)  {
		if (members[i] != NULL && members[i]->IsClient()) // If Group Member is Client
		{
			Client *cmember = members[i]->CastToClient();
			// add exp + exp cap 
			sint16 diff = cmember->GetLevel() - maxlevel;
			sint16 maxdiff = -(cmember->GetLevel()*15/10 - cmember->GetLevel());
				if(maxdiff > -5)
					maxdiff = -5;
			if (diff >= (maxdiff)) { /*Instead of person who killed the mob, the person who has the highest level in the group*/ 				
				uint32 tmp = (cmember->GetLevel()+3) * (cmember->GetLevel()+3) * 75 * 35 / 10;
				uint32 tmp2 = groupexp / membercount;
				cmember->Message(15,"Your share of the Group XP is %u", tmp2); //Shows the amount of group XP gained (RDurbin)
				cmember->AddEXP( tmp < tmp2 ? tmp : tmp2, conlevel ); 
			} 
		} 
	}