Hi,
as described under http://www.wowwiki.com/Formulas:Mob_XP#Two_Character_Groups
a friend has got the same XP when leveling as lowchar with a highchar on the offi...I've tested a little and this works / calculated the XP as expected.
Perhaps it make sense to modify the code a little to look only for the "member_with_max_level" which is the highest member with XP and set a highlevel flag when a higher char exists in the rewarded group. Then it could be compared as below, too.
Index: mangos/src/game/Group.h
===================================================================
--- mangos/src/game/Group.h (Revision 6766)
+++ mangos/src/game/Group.h (Arbeitskopie)
@@ -215,7 +215,7 @@
MemberSlotList const& GetMemberSlots() const { return m_memberSlots; }
GroupReference* GetFirstMember() { return m_memberMgr.getFirst(); }
uint32 GetMembersCount() const { return m_memberSlots.size(); }
- void GetDataForXPAtKill(Unit const* victim, uint32& count,uint32& sum_level, Player* &
member_with_max_level);
+ void GetDataForXPAtKill(Unit const* victim, uint32& count,uint32& sum_level, Player* &
member_with_max_level, Player* & not_gray_member_with_max_level);
uint8 GetMemberGroup(uint64 guid) const
{
member_citerator mslot = _getMemberCSlot(guid);
Index: mangos/src/game/Group.cpp
===================================================================
--- mangos/src/game/Group.cpp (Revision 6766)
+++ mangos/src/game/Group.cpp (Arbeitskopie)
@@ -24,6 +24,7 @@
#include "World.h"
#include "ObjectMgr.h"
#include "Group.h"
+#include "Formulas.h"
#include "ObjectAccessor.h"
#include "BattleGround.h"
#include "MapManager.h"
@@ -783,7 +784,7 @@
BroadcastPacket(&data);
}
-void Group::GetDataForXPAtKill(Unit const* victim, uint32& count,uint32& sum_level, Player* &
member_with_max_level)
+void Group::GetDataForXPAtKill(Unit const* victim, uint32& count,uint32& sum_level, Player* &
member_with_max_level, Player* & not_gray_member_with_max_level)
{
for(GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next())
{
@@ -798,6 +799,11 @@
sum_level += member->getLevel();
if(!member_with_max_level || member_with_max_level->getLevel() < member->getLevel())
member_with_max_level = member;
+
+ uint32 gray_level = MaNGOS::XP::GetGrayLevel(member->getLevel());
+ if( victim->getLevel() > gray_level && (!not_gray_member_with_max_level
+ || not_gray_member_with_max_level->getLevel() < member->getLevel()))
+ not_gray_member_with_max_level = member;
}
}
Index: mangos/src/game/Player.cpp
===================================================================
--- mangos/src/game/Player.cpp (Revision 6766)
+++ mangos/src/game/Player.cpp (Arbeitskopie)
@@ -17815,12 +17815,13 @@
uint32 count = 0;
uint32 sum_level = 0;
Player* member_with_max_level = NULL;
+ Player* not_gray_member_with_max_level = NULL;
- pGroup->GetDataForXPAtKill(pVictim,count,sum_level,member_with_max_level);
+
pGroup->GetDataForXPAtKill(pVictim,count,sum_level,member_with_max_level,not_gray_member_with_max_level);
if(member_with_max_level)
{
- xp = PvP ? 0 : MaNGOS::XP::Gain(member_with_max_level, pVictim);
+ xp = PvP ? 0 : MaNGOS::XP::Gain(not_gray_member_with_max_level, pVictim);
// skip in check PvP case (for speed, not used)
bool is_raid = PvP ? false : sMapStore.LookupEntry(GetMapId())->IsRaid() && pGroup->isRaidGroup();
@@ -17850,9 +17851,10 @@
pGroupGuy->RewardReputation(pVictim,is_dungeon ? 1.0f : rate);
// XP updated only for alive group member
- if(pGroupGuy->isAlive())
+ if(pGroupGuy->isAlive() && not_gray_member_with_max_level &&
+ pGroupGuy->getLevel() <= not_gray_member_with_max_level->getLevel())
{
- uint32 itr_xp = uint32(xp*rate);
+ uint32 itr_xp = (member_with_max_level == not_gray_member_with_max_level) ?
uint32(xp*rate) : uint32((xp*rate/2)+1);
pGroupGuy->GiveXP(itr_xp, pVictim);
if(Pet* pet = pGroupGuy->GetPet())