diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Pet.cpp | 21 | ||||
-rw-r--r-- | src/game/Spell.cpp | 15 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 5 | ||||
-rw-r--r-- | src/game/StatSystem.cpp | 17 |
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); |