Not tested but should answer what you ask
// Add this in Player.h
struct DamageHealData
{
DamageHealData() : damage(0), healing(0) { }
uint32 damage;
uint32 healing;
};
// Add this to Player class
std::map<uint64, DamageHealData*> m_DamagersAndHealers;
// Unit::DealDamage
if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
((Player*)pVictim)->DamagedOrHealed(GetGUID(), damage, 0);
// Unit::DealHeal
if (GetTypeId() == TYPEID_PLAYER && pVictim->GetTypeId() == TYPEID_PLAYER)
((Player*)pVictim)->DamagedOrHealed(GetGUID(), 0, addhealth);
// Unit::ClearInCombat
if (GetTypeId() == TYPEID_PLAYER)
{
Player *p = ((Player*)this);
for (std::map<uint64, DamageHealData*>::iterator itr = p->m_DamagersAndHealers.begin(); itr != p->m_DamagersAndHealers.end(); ++itr)
delete itr->second;
p->m_DamagersAndHealers.clear();
}
void Player::DamagedOrHealed(uint64 guid, uint32 damage, uint32 heal)
{
DamageHealData *data = NULL;
if (!data = m_DamagersAndHealers[guid])
m_DamagersAndHealers[guid] = new DamageHealData();
data->damage += damage;
data->healing += heal;
}
// Example
for (std::map<uint64, DamageHealData*>::iterator itr = m_DamagersAndHealers.begin(); itr != m_DamagersAndHealers.end(); ++itr)
{
if (itr->second->damage > itr->second->healing)
sLog->outString("Player with GUID %u is damager");
else
sLog->outString("Player with GUID %u is healer");
}