*merge
--HG-- branch : trunk
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
#include "GridNotifiers.h"
|
#include "GridNotifiers.h"
|
||||||
#include "GridNotifiersImpl.h"
|
#include "GridNotifiersImpl.h"
|
||||||
#include "InstanceData.h"
|
#include "InstanceData.h"
|
||||||
|
#include "SpellMgr.h"
|
||||||
|
|
||||||
bool CreatureEventAIHolder::UpdateRepeatTimer( Creature* creature, uint32 repeatMin, uint32 repeatMax )
|
bool CreatureEventAIHolder::UpdateRepeatTimer( Creature* creature, uint32 repeatMin, uint32 repeatMax )
|
||||||
{
|
{
|
||||||
@@ -1297,7 +1298,7 @@ bool CreatureEventAI::CanCast(Unit* Target, SpellEntry const *Spell, bool Trigge
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
//Check for power
|
//Check for power
|
||||||
if (!Triggered && me->GetPower((Powers)Spell->powerType) < Spell->manaCost)
|
if (!Triggered && me->GetPower((Powers)Spell->powerType) < CalculatePowerCost(Spell, me, GetSpellSchoolMask(Spell)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
SpellRangeEntry const *TempRange = NULL;
|
SpellRangeEntry const *TempRange = NULL;
|
||||||
|
|||||||
+2
-70
@@ -2621,8 +2621,8 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect* triggeredByAura
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill cost data
|
// Fill cost data (not use power for item casts
|
||||||
m_powerCost = CalculatePowerCost();
|
m_powerCost = m_CastItem ? 0 : CalculatePowerCost(m_spellInfo, m_caster, m_spellSchoolMask);
|
||||||
|
|
||||||
SpellCastResult result = CheckCast(true);
|
SpellCastResult result = CheckCast(true);
|
||||||
if(result != SPELL_CAST_OK && !IsAutoRepeat()) //always cast autorepeat dummy for triggering
|
if(result != SPELL_CAST_OK && !IsAutoRepeat()) //always cast autorepeat dummy for triggering
|
||||||
@@ -5348,74 +5348,6 @@ SpellCastResult Spell::CheckRange(bool strict)
|
|||||||
return SPELL_CAST_OK;
|
return SPELL_CAST_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Spell::CalculatePowerCost()
|
|
||||||
{
|
|
||||||
// item cast not used power
|
|
||||||
if(m_CastItem)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// Spell drain all exist power on cast (Only paladin lay of Hands)
|
|
||||||
if (m_spellInfo->AttributesEx & SPELL_ATTR_EX_DRAIN_ALL_POWER)
|
|
||||||
{
|
|
||||||
// If power type - health drain all
|
|
||||||
if (m_spellInfo->powerType == POWER_HEALTH)
|
|
||||||
return m_caster->GetHealth();
|
|
||||||
// Else drain all power
|
|
||||||
if (m_spellInfo->powerType < MAX_POWERS)
|
|
||||||
return m_caster->GetPower(Powers(m_spellInfo->powerType));
|
|
||||||
sLog.outError("Spell::CalculateManaCost: Unknown power type '%d' in spell %d", m_spellInfo->powerType, m_spellInfo->Id);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base powerCost
|
|
||||||
int32 powerCost = m_spellInfo->manaCost;
|
|
||||||
// PCT cost from total amount
|
|
||||||
if (m_spellInfo->ManaCostPercentage)
|
|
||||||
{
|
|
||||||
switch (m_spellInfo->powerType)
|
|
||||||
{
|
|
||||||
// health as power used
|
|
||||||
case POWER_HEALTH:
|
|
||||||
powerCost += m_spellInfo->ManaCostPercentage * m_caster->GetCreateHealth() / 100;
|
|
||||||
break;
|
|
||||||
case POWER_MANA:
|
|
||||||
powerCost += m_spellInfo->ManaCostPercentage * m_caster->GetCreateMana() / 100;
|
|
||||||
break;
|
|
||||||
case POWER_RAGE:
|
|
||||||
case POWER_FOCUS:
|
|
||||||
case POWER_ENERGY:
|
|
||||||
case POWER_HAPPINESS:
|
|
||||||
powerCost += m_spellInfo->ManaCostPercentage * m_caster->GetMaxPower(Powers(m_spellInfo->powerType)) / 100;
|
|
||||||
break;
|
|
||||||
case POWER_RUNE:
|
|
||||||
case POWER_RUNIC_POWER:
|
|
||||||
sLog.outDebug("Spell::CalculateManaCost: Not implemented yet!");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sLog.outError("Spell::CalculateManaCost: Unknown power type '%d' in spell %d", m_spellInfo->powerType, m_spellInfo->Id);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SpellSchools school = GetFirstSchoolInMask(m_spellSchoolMask);
|
|
||||||
// Flat mod from caster auras by spell school
|
|
||||||
powerCost += m_caster->GetInt32Value(UNIT_FIELD_POWER_COST_MODIFIER + school);
|
|
||||||
// Shiv - costs 20 + weaponSpeed*10 energy (apply only to non-triggered spell with energy cost)
|
|
||||||
if ( m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_SPELL_VS_EXTEND_COST )
|
|
||||||
powerCost += m_caster->GetAttackTime(OFF_ATTACK)/100;
|
|
||||||
// Apply cost mod by spell
|
|
||||||
if(Player* modOwner = m_caster->GetSpellModOwner())
|
|
||||||
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, powerCost, this);
|
|
||||||
|
|
||||||
if(m_spellInfo->Attributes & SPELL_ATTR_LEVEL_DAMAGE_CALCULATION)
|
|
||||||
powerCost = int32(powerCost/ (1.117f* m_spellInfo->spellLevel / m_caster->getLevel() -0.1327f));
|
|
||||||
|
|
||||||
// PCT mod from user auras by school
|
|
||||||
powerCost = int32(powerCost * (1.0f+m_caster->GetFloatValue(UNIT_FIELD_POWER_COST_MULTIPLIER+school)));
|
|
||||||
if (powerCost < 0)
|
|
||||||
powerCost = 0;
|
|
||||||
return powerCost;
|
|
||||||
}
|
|
||||||
|
|
||||||
SpellCastResult Spell::CheckPower()
|
SpellCastResult Spell::CheckPower()
|
||||||
{
|
{
|
||||||
// item cast not used power
|
// item cast not used power
|
||||||
|
|||||||
@@ -390,7 +390,6 @@ class Spell
|
|||||||
SpellCastResult CheckCasterAuras() const;
|
SpellCastResult CheckCasterAuras() const;
|
||||||
|
|
||||||
int32 CalculateDamage(uint8 i, Unit* target) { return m_caster->CalculateSpellDamage(m_spellInfo,i,m_currentBasePoints[i],target); }
|
int32 CalculateDamage(uint8 i, Unit* target) { return m_caster->CalculateSpellDamage(m_spellInfo,i,m_currentBasePoints[i],target); }
|
||||||
int32 CalculatePowerCost();
|
|
||||||
|
|
||||||
bool HaveTargetsForEffect(uint8 effect) const;
|
bool HaveTargetsForEffect(uint8 effect) const;
|
||||||
void Delayed();
|
void Delayed();
|
||||||
|
|||||||
@@ -342,6 +342,70 @@ bool IsHigherHankOfSpell(uint32 spellId_1, uint32 spellId_2)
|
|||||||
return spellmgr.GetSpellRank(spellId_1)<spellmgr.GetSpellRank(spellId_2);
|
return spellmgr.GetSpellRank(spellId_1)<spellmgr.GetSpellRank(spellId_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 CalculatePowerCost(SpellEntry const * spellInfo, Unit const * caster, SpellSchoolMask schoolMask)
|
||||||
|
{
|
||||||
|
// Spell drain all exist power on cast (Only paladin lay of Hands)
|
||||||
|
if (spellInfo->AttributesEx & SPELL_ATTR_EX_DRAIN_ALL_POWER)
|
||||||
|
{
|
||||||
|
// If power type - health drain all
|
||||||
|
if (spellInfo->powerType == POWER_HEALTH)
|
||||||
|
return caster->GetHealth();
|
||||||
|
// Else drain all power
|
||||||
|
if (spellInfo->powerType < MAX_POWERS)
|
||||||
|
return caster->GetPower(Powers(spellInfo->powerType));
|
||||||
|
sLog.outError("CalculateManaCost: Unknown power type '%d' in spell %d", spellInfo->powerType, spellInfo->Id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Base powerCost
|
||||||
|
int32 powerCost = spellInfo->manaCost;
|
||||||
|
// PCT cost from total amount
|
||||||
|
if (spellInfo->ManaCostPercentage)
|
||||||
|
{
|
||||||
|
switch (spellInfo->powerType)
|
||||||
|
{
|
||||||
|
// health as power used
|
||||||
|
case POWER_HEALTH:
|
||||||
|
powerCost += spellInfo->ManaCostPercentage * caster->GetCreateHealth() / 100;
|
||||||
|
break;
|
||||||
|
case POWER_MANA:
|
||||||
|
powerCost += spellInfo->ManaCostPercentage * caster->GetCreateMana() / 100;
|
||||||
|
break;
|
||||||
|
case POWER_RAGE:
|
||||||
|
case POWER_FOCUS:
|
||||||
|
case POWER_ENERGY:
|
||||||
|
case POWER_HAPPINESS:
|
||||||
|
powerCost += spellInfo->ManaCostPercentage * caster->GetMaxPower(Powers(spellInfo->powerType)) / 100;
|
||||||
|
break;
|
||||||
|
case POWER_RUNE:
|
||||||
|
case POWER_RUNIC_POWER:
|
||||||
|
sLog.outDebug("CalculateManaCost: Not implemented yet!");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sLog.outError("CalculateManaCost: Unknown power type '%d' in spell %d", spellInfo->powerType, spellInfo->Id);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SpellSchools school = GetFirstSchoolInMask(schoolMask);
|
||||||
|
// Flat mod from caster auras by spell school
|
||||||
|
powerCost += caster->GetInt32Value(UNIT_FIELD_POWER_COST_MODIFIER + school);
|
||||||
|
// Shiv - costs 20 + weaponSpeed*10 energy (apply only to non-triggered spell with energy cost)
|
||||||
|
if ( spellInfo->AttributesEx4 & SPELL_ATTR_EX4_SPELL_VS_EXTEND_COST )
|
||||||
|
powerCost += caster->GetAttackTime(OFF_ATTACK)/100;
|
||||||
|
// Apply cost mod by spell
|
||||||
|
if(Player* modOwner = caster->GetSpellModOwner())
|
||||||
|
modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_COST, powerCost);
|
||||||
|
|
||||||
|
if(spellInfo->Attributes & SPELL_ATTR_LEVEL_DAMAGE_CALCULATION)
|
||||||
|
powerCost = int32(powerCost/ (1.117f* spellInfo->spellLevel / caster->getLevel() -0.1327f));
|
||||||
|
|
||||||
|
// PCT mod from user auras by school
|
||||||
|
powerCost = int32(powerCost * (1.0f+caster->GetFloatValue(UNIT_FIELD_POWER_COST_MULTIPLIER+school)));
|
||||||
|
if (powerCost < 0)
|
||||||
|
powerCost = 0;
|
||||||
|
return powerCost;
|
||||||
|
}
|
||||||
|
|
||||||
SpellSpecific GetSpellSpecific(uint32 spellId)
|
SpellSpecific GetSpellSpecific(uint32 spellId)
|
||||||
{
|
{
|
||||||
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
|
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
|
||||||
|
|||||||
@@ -240,6 +240,8 @@ bool IsSingleFromSpellSpecificPerTarget(uint32 spellSpec1, uint32 spellSpec2);
|
|||||||
bool IsPassiveSpell(uint32 spellId);
|
bool IsPassiveSpell(uint32 spellId);
|
||||||
bool IsAutocastableSpell(uint32 spellId);
|
bool IsAutocastableSpell(uint32 spellId);
|
||||||
|
|
||||||
|
uint32 CalculatePowerCost(SpellEntry const * spellInfo, Unit const * caster, SpellSchoolMask schoolMask);
|
||||||
|
|
||||||
inline bool IsPassiveSpellStackableWithRanks(SpellEntry const* spellProto)
|
inline bool IsPassiveSpellStackableWithRanks(SpellEntry const* spellProto)
|
||||||
{
|
{
|
||||||
if(!IsPassiveSpell(spellProto->Id))
|
if(!IsPassiveSpell(spellProto->Id))
|
||||||
|
|||||||
Reference in New Issue
Block a user