aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Pet.cpp21
-rw-r--r--src/game/Spell.cpp15
-rw-r--r--src/game/SpellMgr.cpp5
-rw-r--r--src/game/StatSystem.cpp17
4 files changed, 51 insertions, 7 deletions
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index 836ee6d8459..72d9f725a3b 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -1152,6 +1152,25 @@ bool Pet::InitStatsForLevel(uint32 petlevel)
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000);
+ switch(GetEntry())
+ {
+ case 1964: //force of nature
+ SetCreateHealth(30 + 30*petlevel);
+ SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel * 2.5f - (petlevel / 2)));
+ SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel * 2.5f + (petlevel / 2)));
+ break;
+ case 15352: //earth elemental 36213
+ SetCreateHealth(100 + 120*petlevel);
+ SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - (petlevel / 4)));
+ SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel + (petlevel / 4)));
+ break;
+ case 15438: //fire elemental
+ SetCreateHealth(30 + 40*petlevel);
+ SetCreateMana(28 + 10*petlevel);
+ SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel * 4 - petlevel));
+ SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel * 4 + petlevel));
+ break;
+ default:
SetCreateMana(28 + 10*petlevel);
SetCreateHealth(28 + 30*petlevel);
@@ -1161,6 +1180,8 @@ bool Pet::InitStatsForLevel(uint32 petlevel)
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - (petlevel / 4)));
//damage range is then petlevel / 2
SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel + (petlevel / 4)));
+ break;
+ }
break;
default:
sLog.outError("Pet have incorrect type (%u) for levelup.", getPetType());
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 6f5dd73f724..c4a73950381 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -409,10 +409,11 @@ void Spell::FillTargetMap()
if(!m_spellInfo->Effect[i])
continue;
- // TODO: find a way so this is not needed?
- // for area auras always add caster as target (needed for totems for example)
- if(IsAreaAuraEffect(m_spellInfo->Effect[i]))
- AddUnitTarget(m_caster, i);
+ uint32 effectTargetType = spellmgr.EffectTargetType[m_spellInfo->Effect[i]];
+
+ // is it possible that areaaura is not applied to caster?
+ if(effectTargetType == SPELL_REQUIRE_NONE)
+ continue;
std::list<Unit*> tmpUnitMap;
uint32 targetA = m_spellInfo->EffectImplicitTargetA[i];
@@ -423,9 +424,9 @@ void Spell::FillTargetMap()
if(targetB) // In very rare case !A && B
SetTargetMap(i, targetB, tmpUnitMap);
- if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] != SPELL_REQUIRE_UNIT)
+ if(effectTargetType != SPELL_REQUIRE_UNIT)
{
- if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_DEST)
+ if(effectTargetType == SPELL_REQUIRE_DEST)
{
if(m_targets.HasDest() && m_spellInfo->speed > 0.0f)
{
@@ -434,7 +435,7 @@ void Spell::FillTargetMap()
m_delayMoment = (uint64) floor(dist / m_spellInfo->speed * 1000.0f);
}
}
- else if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_ITEM)
+ else if(effectTargetType == SPELL_REQUIRE_ITEM)
{
if(m_targets.getItemTarget())
AddItemTarget(m_targets.getItemTarget(), i);
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 78175708cba..2e285ea7176 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -64,6 +64,11 @@ SpellMgr::SpellMgr()
//case SPELL_EFFECT_LEARN_SPELL: // 0 may be 5 pet
case SPELL_EFFECT_TRADE_SKILL: // 0 or 1
case SPELL_EFFECT_PROFICIENCY: // 0
+ case SPELL_EFFECT_APPLY_AREA_AURA_PARTY:
+ case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND:
+ case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY:
+ case SPELL_EFFECT_APPLY_AREA_AURA_PET:
+ case SPELL_EFFECT_APPLY_AREA_AURA_OWNER:
EffectTargetType[i] = SPELL_REQUIRE_NONE;
break;
case SPELL_EFFECT_ENCHANT_ITEM:
diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp
index 3e9ddcf3bef..dd324fbc684 100644
--- a/src/game/StatSystem.cpp
+++ b/src/game/StatSystem.cpp
@@ -944,6 +944,23 @@ void Pet::UpdateAttackPowerAndDamage(bool ranged)
frost = 0;
SetBonusDamage( int32(frost * 0.4f));
}
+ //force of nature
+ else if(GetEntry() == 1964)
+ {
+ int32 spellDmg = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_NATURE)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_NATURE);
+ if(spellDmg > 0)
+ SetBonusDamage(int32(spellDmg * 0.09f));
+ }
+ //greater fire elemental
+ else if(GetEntry() == 15438)
+ {
+ if(Unit* shaman = owner->GetOwner())
+ {
+ int32 spellDmg = int32(shaman->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) - shaman->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE);
+ if(spellDmg > 0)
+ SetBonusDamage(int32(spellDmg * 0.4f));
+ }
+ }
}
SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, val + bonusAP);