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);  | 
