Fixed Drain Soul and Shadowburn Soul Shard on target death. Closes issue 1058.

--HG--
branch : trunk
This commit is contained in:
Xanadu
2010-03-15 02:59:21 +01:00
parent 1845a9588d
commit 8cc3d2ad7f
2 changed files with 12 additions and 8 deletions
+6 -6
View File
@@ -5988,13 +5988,12 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const * aurApp, uint8 mo
{ {
Unit * caster = GetCaster(); Unit * caster = GetCaster();
if(!caster || caster->GetTypeId() != TYPEID_PLAYER)// || m_removeMode!=AURA_REMOVE_BY_DEATH) if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
return; return;
//we cannot check removemode = death if(target->getDeathState() != JUST_DIED)
//talent will remove the caster's aura->interrupt channel->remove victim aura
if(target->GetHealth() > 0)
return; return;
// Item amount // Item amount
if (GetAmount() <= 0) if (GetAmount() <= 0)
return; return;
@@ -6002,11 +6001,12 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const * aurApp, uint8 mo
if(GetSpellProto()->EffectItemType[m_effIndex] == 0) if(GetSpellProto()->EffectItemType[m_effIndex] == 0)
return; return;
// Soul Shard only from non-grey units // Soul Shard only from units that grant XP or honor
if( GetSpellProto()->EffectItemType[m_effIndex] == 6265 && if( GetSpellProto()->EffectItemType[m_effIndex] == 6265 &&
(target->getLevel() <= Trinity::XP::GetGrayLevel(caster->getLevel()) || (!caster->ToPlayer()->isHonorOrXPTarget(target) ||
target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(caster->ToPlayer())) ) target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(caster->ToPlayer())) )
return; return;
//Adding items //Adding items
uint32 noSpaceForCount = 0; uint32 noSpaceForCount = 0;
uint32 count = m_amount; uint32 count = m_amount;
+6 -2
View File
@@ -11976,6 +11976,11 @@ void Unit::SetHover(bool on)
void Unit::setDeathState(DeathState s) void Unit::setDeathState(DeathState s)
{ {
// death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
// it can be used to check creation of death items (such as soul shards).
DeathState oldDeathState = m_deathState;
m_deathState = s;
if (s != ALIVE && s != JUST_ALIVED) if (s != ALIVE && s != JUST_ALIVED)
{ {
CombatStop(); CombatStop();
@@ -12012,13 +12017,12 @@ void Unit::setDeathState(DeathState s)
else if (s == JUST_ALIVED) else if (s == JUST_ALIVED)
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground) RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
if (m_deathState != ALIVE && s == ALIVE) if (oldDeathState != ALIVE && s == ALIVE)
{ {
//_ApplyAllAuraMods(); //_ApplyAllAuraMods();
// Reset display id on resurection - needed by corpse explosion to cleanup after display change // Reset display id on resurection - needed by corpse explosion to cleanup after display change
SetDisplayId(GetNativeDisplayId()); SetDisplayId(GetNativeDisplayId());
} }
m_deathState = s;
} }
/*######################################## /*########################################