* avoid loot/exp when the mobs are killed by npc. Authore: KAPATEJIb @ getmangos.org

--HG--
branch : trunk
This commit is contained in:
Muhaha
2009-05-13 10:34:55 +02:00
parent 11e66c1cf0
commit 62c5720227
7 changed files with 32 additions and 4 deletions
+1
View File
@@ -93,6 +93,7 @@ void AggressorAI::EnterEvadeMode()
i_victimGuid = 0; i_victimGuid = 0;
i_creature.CombatStop(); i_creature.CombatStop();
i_creature.SetLootRecipient(NULL); i_creature.SetLootRecipient(NULL);
i_creature.ResetDamageByPlayers();
} }
void void
+2
View File
@@ -159,6 +159,7 @@ m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),m_creatureInfo(NULL), m_DBTabl
m_GlobalCooldown = 0; m_GlobalCooldown = 0;
m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE; m_unit_movement_flags = MOVEMENTFLAG_WALK_MODE;
DisableReputationGain = false; DisableReputationGain = false;
ResetDamageByPlayers();
} }
Creature::~Creature() Creature::~Creature()
@@ -1653,6 +1654,7 @@ void Creature::setDeathState(DeathState s)
// setActive(true); // setActive(true);
SetHealth(GetMaxHealth()); SetHealth(GetMaxHealth());
SetLootRecipient(NULL); SetLootRecipient(NULL);
ResetDamageByPlayers();
Unit::setDeathState(ALIVE); Unit::setDeathState(ALIVE);
CreatureInfo const *cinfo = GetCreatureInfo(); CreatureInfo const *cinfo = GetCreatureInfo();
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
+5
View File
@@ -637,6 +637,10 @@ class TRINITY_DLL_SPEC Creature : public Unit
void SetDisableReputationGain(bool disable) { DisableReputationGain = disable; } void SetDisableReputationGain(bool disable) { DisableReputationGain = disable; }
bool IsReputationGainDisabled() { return DisableReputationGain; } bool IsReputationGainDisabled() { return DisableReputationGain; }
bool IsDamageEnoughForLootingAndReward() { return m_unDamageByPlayers >= (uint32)(GetMaxHealth() / 2); }
void AddDamageByPlayers(uint32 unDamage) { m_unDamageByPlayers += unDamage; }
void ResetDamageByPlayers() { m_unDamageByPlayers = 0; }
protected: protected:
bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL); bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL);
bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL); bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL);
@@ -651,6 +655,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint32 m_lootMoney; uint32 m_lootMoney;
uint64 m_lootRecipient; uint64 m_lootRecipient;
uint32 m_unDamageByPlayers;
/// Timers /// Timers
uint32 m_deathTimer; // (msecs)timer for death or corpse disappearance uint32 m_deathTimer; // (msecs)timer for death or corpse disappearance
+1
View File
@@ -100,6 +100,7 @@ void CreatureAI::EnterEvadeMode()
me->CombatStop(); me->CombatStop();
me->LoadCreaturesAddon(); me->LoadCreaturesAddon();
me->SetLootRecipient(NULL); me->SetLootRecipient(NULL);
me->ResetDamageByPlayers();
if(me->isAlive()) if(me->isAlive())
me->GetMotionMaster()->MoveTargetedHome(); me->GetMotionMaster()->MoveTargetedHome();
+3
View File
@@ -14379,6 +14379,9 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
bool Player::isAllowedToLoot(Creature* creature) bool Player::isAllowedToLoot(Creature* creature)
{ {
if(creature->isDead() && !creature->IsDamageEnoughForLootingAndReward())
return false;
if(Player* recipient = creature->GetLootRecipient()) if(Player* recipient = creature->GetLootRecipient())
{ {
if (recipient == this) if (recipient == this)
+1
View File
@@ -104,6 +104,7 @@ ReactorAI::EnterEvadeMode()
i_victimGuid = 0; i_victimGuid = 0;
i_creature.CombatStop(); i_creature.CombatStop();
i_creature.SetLootRecipient(NULL); i_creature.SetLootRecipient(NULL);
i_creature.ResetDamageByPlayers();
if(!i_creature.GetCharmerOrOwner()) if(!i_creature.GetCharmerOrOwner())
{ {
+18 -3
View File
@@ -788,8 +788,15 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
} }
} }
if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient()) if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet())
{
if(!((Creature*)pVictim)->hasLootRecipient())
((Creature*)pVictim)->SetLootRecipient(this); ((Creature*)pVictim)->SetLootRecipient(this);
if(GetCharmerOrOwnerPlayerOrPlayerItself())
((Creature*)pVictim)->AddDamageByPlayers(health < damage ? health : damage);
}
if (health <= damage) if (health <= damage)
{ {
DEBUG_LOG("DealDamage: victim just died"); DEBUG_LOG("DealDamage: victim just died");
@@ -12471,11 +12478,19 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
// find player: owner of controlled `this` or `this` itself maybe // find player: owner of controlled `this` or `this` itself maybe
Player *player = GetCharmerOrOwnerPlayerOrPlayerItself(); Player *player = GetCharmerOrOwnerPlayerOrPlayerItself();
if(pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->GetLootRecipient()) bool bRewardIsAllowed = true;
if(pVictim->GetTypeId() == TYPEID_UNIT)
{
bRewardIsAllowed = ((Creature*)pVictim)->IsDamageEnoughForLootingAndReward();
if(!bRewardIsAllowed)
((Creature*)pVictim)->SetLootRecipient(NULL);
}
if(bRewardIsAllowed && pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->GetLootRecipient())
player = ((Creature*)pVictim)->GetLootRecipient(); player = ((Creature*)pVictim)->GetLootRecipient();
// Reward player, his pets, and group/raid members // Reward player, his pets, and group/raid members
// call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop) // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
if(player && player!=pVictim) if(bRewardIsAllowed && player && player!=pVictim)
{ {
if(player->RewardPlayerAndGroupAtKill(pVictim)) if(player->RewardPlayerAndGroupAtKill(pVictim))
player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL_AND_GET_XP, PROC_FLAG_KILLED, PROC_EX_NONE, 0); player->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL_AND_GET_XP, PROC_FLAG_KILLED, PROC_EX_NONE, 0);