diff options
| author | Vincent_Michael <Vincent_Michael@gmx.de> | 2014-01-26 18:22:06 +0100 |
|---|---|---|
| committer | Vincent_Michael <Vincent_Michael@gmx.de> | 2014-01-26 18:22:06 +0100 |
| commit | 7cc482855421a6d6cc02c5ed9148cfde543ba8d6 (patch) | |
| tree | ed54bedb7e9d0c88fa9d4326426eb1f4aef786ce /src/server/game/Spells/Spell.cpp | |
| parent | bdc150ebbd06e5f83b893d3771677f2e670c87d5 (diff) | |
| parent | 79a2a0c434d24c7bf65a0625fad9dfe87533e2fd (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/Entities/Player/Player.cpp
src/server/game/Entities/Unit/Unit.cpp
src/server/game/Spells/Spell.cpp
src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp
src/server/scripts/Spells/spell_paladin.cpp
src/server/scripts/Spells/spell_priest.cpp
src/server/scripts/Spells/spell_shaman.cpp
src/server/scripts/Spells/spell_warrior.cpp
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 197 |
1 files changed, 38 insertions, 159 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a526be904a3..f1a58cb7e91 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1144,6 +1144,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge ASSERT(false && "Spell::SelectImplicitAreaTargets: received not implemented target reference type"); return; } + if (!referer) return; @@ -1165,6 +1166,7 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge ASSERT(false && "Spell::SelectImplicitAreaTargets: received not implemented target reference type"); return; } + std::list<WorldObject*> targets; float radius = m_spellInfo->Effects[effIndex].CalcRadius(m_caster) * m_spellValue->RadiusMod; SearchAreaTargets(targets, radius, center, referer, targetType.GetObjectType(), targetType.GetCheckType(), m_spellInfo->Effects[effIndex].ImplicitTargetConditions); @@ -1242,142 +1244,19 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge CallScriptObjectAreaTargetSelectHandlers(targets, effIndex); - std::list<Unit*> unitTargets; - std::list<GameObject*> gObjTargets; - // for compability with older code - add only unit and go targets - /// @todo remove this - for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) - { - if (Unit* unitTarget = (*itr)->ToUnit()) - unitTargets.push_back(unitTarget); - else if (GameObject* gObjTarget = (*itr)->ToGameObject()) - gObjTargets.push_back(gObjTarget); - } - - if (!unitTargets.empty()) + if (!targets.empty()) { - // Special target selection for smart heals and energizes - uint32 maxSize = 0; - int32 power = -1; - switch (m_spellInfo->SpellFamilyName) - { - case SPELLFAMILY_GENERIC: - switch (m_spellInfo->Id) - { - case 52759: // Ancestral Awakening - case 71610: // Echoes of Light (Althor's Abacus normal version) - case 71641: // Echoes of Light (Althor's Abacus heroic version) - maxSize = 1; - power = POWER_HEALTH; - break; - case 54968: // Glyph of Holy Light - maxSize = m_spellInfo->MaxAffectedTargets; - power = POWER_HEALTH; - break; - case 57669: // Replenishment - // In arenas Replenishment may only affect the caster - if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->InArena()) - { - unitTargets.clear(); - unitTargets.push_back(m_caster); - break; - } - maxSize = 10; - power = POWER_MANA; - break; - default: - break; - } - break; - case SPELLFAMILY_PRIEST: - if (m_spellInfo->SpellFamilyFlags[0] == 0x10000000) // Circle of Healing - { - maxSize = m_caster->HasAura(55675) ? 6 : 5; // Glyph of Circle of Healing - power = POWER_HEALTH; - } - else if (m_spellInfo->Id == 64844) // Divine Hymn - { - maxSize = 3; - power = POWER_HEALTH; - } - else if (m_spellInfo->Id == 64904) // Hymn of Hope - { - maxSize = 3; - power = POWER_MANA; - } - else - break; - - // Remove targets outside caster's raid - for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end();) - { - if (!(*itr)->IsInRaidWith(m_caster)) - itr = unitTargets.erase(itr); - else - ++itr; - } - break; - case SPELLFAMILY_DRUID: - if (m_spellInfo->SpellFamilyFlags[1] == 0x04000000) // Wild Growth - { - maxSize = m_caster->HasAura(62970) ? 6 : 5; // Glyph of Wild Growth - power = POWER_HEALTH; - } - else - break; - - // Remove targets outside caster's raid - for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end();) - if (!(*itr)->IsInRaidWith(m_caster)) - itr = unitTargets.erase(itr); - else - ++itr; - break; - default: - break; - } - - if (maxSize && power != -1) - { - if (Powers(power) == POWER_HEALTH) - { - if (unitTargets.size() > maxSize) - { - unitTargets.sort(Trinity::HealthPctOrderPred()); - unitTargets.resize(maxSize); - } - } - else - { - for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end();) - if ((*itr)->getPowerType() != (Powers)power) - itr = unitTargets.erase(itr); - else - ++itr; - - if (unitTargets.size() > maxSize) - { - unitTargets.sort(Trinity::PowerPctOrderPred((Powers)power)); - unitTargets.resize(maxSize); - } - } - } - // Other special target selection goes here if (uint32 maxTargets = m_spellValue->MaxAffectedTargets) - Trinity::Containers::RandomResizeList(unitTargets, maxTargets); - - for (std::list<Unit*>::iterator itr = unitTargets.begin(); itr != unitTargets.end(); ++itr) - AddUnitTarget(*itr, effMask, false); - } - - if (!gObjTargets.empty()) - { - if (uint32 maxTargets = m_spellValue->MaxAffectedTargets) - Trinity::Containers::RandomResizeList(gObjTargets, maxTargets); + Trinity::Containers::RandomResizeList(targets, maxTargets); - for (std::list<GameObject*>::iterator itr = gObjTargets.begin(); itr != gObjTargets.end(); ++itr) - AddGOTarget(*itr, effMask); + for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) + { + if (Unit* unitTarget = (*itr)->ToUnit()) + AddUnitTarget(unitTarget, effMask, false); + else if (GameObject* gObjTarget = (*itr)->ToGameObject()) + AddGOTarget(gObjTarget, effMask); + } } } @@ -1411,33 +1290,33 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici break; case TARGET_DEST_CASTER_FISHING: { - float min_dis = m_spellInfo->GetMinRange(true); - float max_dis = m_spellInfo->GetMaxRange(true); - float dis = (float)rand_norm() * (max_dis - min_dis) + min_dis; - float x, y, z, angle; - angle = (float)rand_norm() * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); - m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dis, angle); - - float ground = z; - float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground); - if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level - { - SendCastResult(SPELL_FAILED_NOT_HERE); - SendChannelUpdate(0); - finish(false); - return; - } - - if (ground + 0.75 > liquidLevel) - { - SendCastResult(SPELL_FAILED_TOO_SHALLOW); - SendChannelUpdate(0); - finish(false); - return; - } - - dest = SpellDestination(x, y, liquidLevel, m_caster->GetOrientation()); - break; + float minDist = m_spellInfo->GetMinRange(true); + float maxDist = m_spellInfo->GetMaxRange(true); + float dist = frand(minDist, maxDist); + float x, y, z; + float angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); + m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dist, angle); + + float ground = z; + float liquidLevel = m_caster->GetMap()->GetWaterOrGroundLevel(x, y, z, &ground); + if (liquidLevel <= ground) // When there is no liquid Map::GetWaterOrGroundLevel returns ground level + { + SendCastResult(SPELL_FAILED_NOT_HERE); + SendChannelUpdate(0); + finish(false); + return; + } + + if (ground + 0.75 > liquidLevel) + { + SendCastResult(SPELL_FAILED_TOO_SHALLOW); + SendChannelUpdate(0); + finish(false); + return; + } + + dest = SpellDestination(x, y, liquidLevel, m_caster->GetOrientation()); + break; } default: { |
