mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
Merge commit 'origin/master' into 320
This commit is contained in:
commit
258e19a4a3
48 changed files with 744 additions and 206 deletions
|
|
@ -1862,6 +1862,8 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
|
|||
|
||||
// Reduce shield amount
|
||||
mod->m_amount-=currentAbsorb;
|
||||
if((*i)->DropAuraCharge())
|
||||
mod->m_amount = 0;
|
||||
// Need remove it later
|
||||
if (mod->m_amount<=0)
|
||||
existExpired = true;
|
||||
|
|
@ -3436,7 +3438,8 @@ bool Unit::AddAura(Aura *Aur)
|
|||
// Aura can stack on self -> Stack it;
|
||||
if(aurSpellInfo->StackAmount)
|
||||
{
|
||||
i2->second->modStackAmount(1);
|
||||
// can be created with >1 stack by some spell mods
|
||||
i2->second->modStackAmount(Aur->GetStackAmount());
|
||||
delete Aur;
|
||||
return false;
|
||||
}
|
||||
|
|
@ -5134,6 +5137,16 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
|||
CastSpell(this, 28682, true, castItem, triggeredByAura);
|
||||
return (procEx & PROC_EX_CRITICAL_HIT); // charge update only at crit hits, no hidden cooldowns
|
||||
}
|
||||
// Glyph of Ice Block
|
||||
case 56372:
|
||||
{
|
||||
if (GetTypeId() != TYPEID_PLAYER)
|
||||
return false;
|
||||
|
||||
// not 100% safe with client version switches but for 3.1.3 no spells with cooldown that can have mage player except Frost Nova.
|
||||
((Player*)this)->RemoveSpellCategoryCooldown(35, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -6121,8 +6134,16 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
|||
// Earth Shield
|
||||
if (dummySpell->SpellFamilyFlags & UI64LIT(0x0000040000000000))
|
||||
{
|
||||
basepoints0 = triggerAmount;
|
||||
target = this;
|
||||
basepoints0 = triggerAmount;
|
||||
|
||||
// Glyph of Earth Shield
|
||||
if (Aura* aur = GetDummyAura(63279))
|
||||
{
|
||||
int32 aur_mod = aur->GetModifier()->m_amount;
|
||||
basepoints0 = int32(basepoints0 * (aur_mod + 100.0f) / 100.0f);
|
||||
}
|
||||
|
||||
triggered_spell_id = 379;
|
||||
break;
|
||||
}
|
||||
|
|
@ -6983,6 +7004,12 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
|
|||
break;
|
||||
}
|
||||
}
|
||||
// Blade Barrier
|
||||
if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && auraSpellInfo->SpellIconID == 85)
|
||||
{
|
||||
if (this->GetTypeId() != TYPEID_PLAYER || !((Player*)this)->IsBaseRuneSlotsOnCooldown(RUNE_BLOOD))
|
||||
return false;
|
||||
}
|
||||
|
||||
// Custom basepoints/target for exist spell
|
||||
// dummy basepoints or other customs
|
||||
|
|
@ -8218,7 +8245,17 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
|
|||
if (spellProto->SpellIconID == 186)
|
||||
{
|
||||
if (pVictim->isFrozen())
|
||||
DoneTotalMod *= 3.0f;
|
||||
{
|
||||
float multiplier = 3.0f;
|
||||
|
||||
// if target have higher level
|
||||
if (pVictim->getLevel() > getLevel())
|
||||
// Glyph of Ice Lance
|
||||
if (Aura* glyph = GetDummyAura(56377))
|
||||
multiplier = glyph->GetModifier()->m_amount;
|
||||
|
||||
DoneTotalMod *= multiplier;
|
||||
}
|
||||
}
|
||||
// Torment the weak affected (Arcane Barrage, Arcane Blast, Frostfire Bolt, Arcane Missiles, Fireball)
|
||||
if ((spellProto->SpellFamilyFlags & UI64LIT(0x0000900020200021)) &&
|
||||
|
|
@ -8475,7 +8512,8 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
|
|||
crit_chance -= ((Player*)pVictim)->GetRatingBonusValue(CR_CRIT_TAKEN_SPELL);
|
||||
}
|
||||
|
||||
// scripted (increase crit chance ... against ... target by x%
|
||||
// scripted (increase crit chance ... against ... target by x%)
|
||||
// scripted (Increases the critical effect chance of your .... by x% on targets ...)
|
||||
AuraList const& mOverrideClassScript = GetAurasByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
|
||||
for(AuraList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
|
||||
{
|
||||
|
|
@ -8486,21 +8524,15 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
|
|||
case 849: if (pVictim->isFrozen()) crit_chance+= 17.0f; break; //Shatter Rank 1
|
||||
case 910: if (pVictim->isFrozen()) crit_chance+= 34.0f; break; //Shatter Rank 2
|
||||
case 911: if (pVictim->isFrozen()) crit_chance+= 50.0f; break; //Shatter Rank 3
|
||||
case 7917: // Glyph of Shadowburn
|
||||
case 7917: // Glyph of Shadowburn
|
||||
if (pVictim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT))
|
||||
crit_chance+=(*i)->GetModifier()->m_amount;
|
||||
break;
|
||||
case 7997: // Renewed Hope
|
||||
case 7997: // Renewed Hope
|
||||
case 7998:
|
||||
if (pVictim->HasAura(6788))
|
||||
crit_chance+=(*i)->GetModifier()->m_amount;
|
||||
break;
|
||||
case 21: // Test of Faith
|
||||
case 6935:
|
||||
case 6918:
|
||||
if (pVictim->GetHealth() < pVictim->GetMaxHealth()/2)
|
||||
crit_chance+=(*i)->GetModifier()->m_amount;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -8508,23 +8540,40 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
|
|||
// Custom crit by class
|
||||
switch(spellProto->SpellFamilyName)
|
||||
{
|
||||
case SPELLFAMILY_PRIEST:
|
||||
// Flash Heal
|
||||
if (spellProto->SpellFamilyFlags & UI64LIT(0x0000000000000800))
|
||||
{
|
||||
if (pVictim->GetHealth() > pVictim->GetMaxHealth()/2)
|
||||
break;
|
||||
AuraList const& mDummyAuras = GetAurasByType(SPELL_AURA_DUMMY);
|
||||
for(AuraList::const_iterator i = mDummyAuras.begin(); i!= mDummyAuras.end(); ++i)
|
||||
{
|
||||
// Improved Flash Heal
|
||||
if ((*i)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_PRIEST &&
|
||||
(*i)->GetSpellProto()->SpellIconID == 2542)
|
||||
{
|
||||
crit_chance+=(*i)->GetModifier()->m_amount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SPELLFAMILY_PALADIN:
|
||||
// Sacred Shield
|
||||
if (spellProto->SpellFamilyFlags & UI64LIT(0x0000000040000000))
|
||||
{
|
||||
Aura *aura = pVictim->GetDummyAura(58597);
|
||||
if (aura && aura->GetCasterGUID() == GetGUID())
|
||||
crit_chance+=aura->GetModifier()->m_amount;
|
||||
break;
|
||||
crit_chance+=aura->GetModifier()->m_amount;
|
||||
}
|
||||
// Exorcism
|
||||
else if (spellProto->Category == 19)
|
||||
{
|
||||
if (pVictim->GetCreatureTypeMask() & CREATURE_TYPEMASK_DEMON_OR_UNDEAD)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case SPELLFAMILY_SHAMAN:
|
||||
// Lava Burst
|
||||
if (spellProto->SpellFamilyFlags & UI64LIT(0x0000100000000000))
|
||||
|
|
@ -8536,9 +8585,8 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM
|
|||
pVictim->RemoveAurasByCasterSpell(flameShock->GetId(), GetGUID());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -9417,7 +9465,7 @@ int32 Unit::ModifyPower(Powers power, int32 dVal)
|
|||
|
||||
bool Unit::isVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, bool detect, bool inVisibleList, bool is3dDistance) const
|
||||
{
|
||||
if(!u)
|
||||
if(!u || !IsInMap(u))
|
||||
return false;
|
||||
|
||||
// Always can see self
|
||||
|
|
@ -9440,6 +9488,7 @@ bool Unit::isVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, boo
|
|||
if(m_Visibility==VISIBILITY_RESPAWN)
|
||||
return false;
|
||||
|
||||
Map& _map = *u->GetMap();
|
||||
// Grid dead/alive checks
|
||||
if( u->GetTypeId()==TYPEID_PLAYER)
|
||||
{
|
||||
|
|
@ -9483,26 +9532,26 @@ bool Unit::isVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, boo
|
|||
if(u->GetTypeId()==TYPEID_PLAYER)
|
||||
{
|
||||
// Players far than max visible distance for player or not in our map are not visible too
|
||||
if (!at_same_transport && !IsWithinDistInMap(viewPoint,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
if (!at_same_transport && !IsWithinDistInMap(viewPoint, _map.GetVisibilityDistance() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Units far than max visible distance for creature or not in our map are not visible too
|
||||
if (!IsWithinDistInMap(viewPoint,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
if (!IsWithinDistInMap(viewPoint, _map.GetVisibilityDistance() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if(GetCharmerOrOwnerGUID()) // distance for show pet/charmed
|
||||
{
|
||||
// Pet/charmed far than max visible distance for player or not in our map are not visible too
|
||||
if (!IsWithinDistInMap(viewPoint,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
if (!IsWithinDistInMap(viewPoint, _map.GetVisibilityDistance() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
return false;
|
||||
}
|
||||
else // distance for show creature
|
||||
{
|
||||
// Units far than max visible distance for creature or not in our map are not visible too
|
||||
if (!IsWithinDistInMap(viewPoint,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
if (!IsWithinDistInMap(viewPoint, _map.GetVisibilityDistance() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -11690,8 +11739,8 @@ Unit* Unit::SelectNearbyTarget(Unit* except /*= NULL*/) const
|
|||
TypeContainerVisitor<MaNGOS::UnitListSearcher<MaNGOS::AnyUnfriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
||||
|
||||
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||
cell_lock->Visit(cell_lock, world_unit_searcher, *GetMap());
|
||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *GetMap());
|
||||
cell_lock->Visit(cell_lock, world_unit_searcher, *GetMap(), *this, ATTACK_DISTANCE);
|
||||
cell_lock->Visit(cell_lock, grid_unit_searcher, *GetMap(), *this, ATTACK_DISTANCE);
|
||||
}
|
||||
|
||||
// remove current target
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue