diff options
author | QAston <qaston@gmail.com> | 2011-06-23 13:28:52 +0200 |
---|---|---|
committer | QAston <qaston@gmail.com> | 2011-06-23 13:28:52 +0200 |
commit | 3137a82c7cedb71f4a8ef06cb2d6e5741af65c9b (patch) | |
tree | 2c2345632592f55129ddd931e8b97391b0e2efb8 /src | |
parent | 9d9472e5cc2f761fbc93f8f0e87903898bf48b91 (diff) |
Core/Spells: Cleanup in Spell.h:
- Codestyle (fix function naming) and cleanup changes in SpellCastTargets class, also access variables of this class by getters/setters
- Move IsQuestTameSpell function to SpellMgr.h
- Move UnitList typedef to Unit.h
Additionally - add missing copyright notice to SpellAuraEffects.h
Diffstat (limited to 'src')
19 files changed, 569 insertions, 527 deletions
diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index a4cc49bf850..3f4c467d79e 100755 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -212,7 +212,7 @@ void PetAI::UpdateAI(const uint32 diff) targetSpellStore.erase(targetSpellStore.begin() + index); SpellCastTargets targets; - targets.setUnitTarget(target); + targets.SetUnitTarget(target); if (!me->HasInArc(M_PI, target)) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8c7536babd4..02da95581c0 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -845,7 +845,7 @@ void Unit::CastSpell(Unit* Victim, SpellEntry const *spellInfo, bool triggered, originalCaster=owner->GetGUID(); SpellCastTargets targets; - targets.setUnitTarget(Victim); + targets.SetUnitTarget(Victim); if (castItem) sLog->outStaticDebug("WORLD: cast Item spellId - %i", spellInfo->Id); @@ -888,7 +888,7 @@ void Unit::CastCustomSpell(uint32 spellId, CustomSpellValues const &value, Unit* } SpellCastTargets targets; - targets.setUnitTarget(Victim); + targets.SetUnitTarget(Victim); if (!originalCaster && triggeredByAura) originalCaster = triggeredByAura->GetCasterGUID(); @@ -927,9 +927,9 @@ void Unit::CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Spell* spell = new Spell(this, spellInfo, triggered, originalCaster); SpellCastTargets targets; - targets.setDst(x, y, z, GetOrientation()); + targets.SetDst(x, y, z, GetOrientation()); if (OriginalVictim) - targets.setUnitTarget(OriginalVictim); + targets.SetUnitTarget(OriginalVictim); spell->m_CastItem = castItem; spell->prepare(&targets, triggeredByAura); } @@ -963,7 +963,7 @@ void Unit::CastSpell(GameObject *go, uint32 spellId, bool triggered, Item *castI Spell* spell = new Spell(this, spellInfo, triggered, originalCaster); SpellCastTargets targets; - targets.setGOTarget(go); + targets.SetGOTarget(go); spell->m_CastItem = castItem; spell->prepare(&targets, triggeredByAura); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 4497a9ea61c..52e85b2e3db 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -338,6 +338,8 @@ class Totem; class Transport; class Vehicle; +typedef std::list<Unit*> UnitList; + struct SpellImmune { uint32 type; diff --git a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp index 0c969c49184..625ce518e28 100755 --- a/src/server/game/Server/Protocol/Handlers/PetHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/PetHandler.cpp @@ -332,7 +332,7 @@ void WorldSession::HandlePetActionHelper(Unit *pet, uint64 guid1, uint16 spellid if (unit_target->GetTypeId() == TYPEID_PLAYER) pet->SendUpdateToPlayer((Player*)unit_target); } - else if (Unit *unit_target2 = spell->m_targets.getUnitTarget()) + else if (Unit *unit_target2 = spell->m_targets.GetUnitTarget()) { pet->SetInFront(unit_target2); if (unit_target2->GetTypeId() == TYPEID_PLAYER) @@ -348,7 +348,7 @@ void WorldSession::HandlePetActionHelper(Unit *pet, uint64 guid1, uint16 spellid { pet->ToCreature()->AddCreatureSpellCooldown(spellid); - unit_target = spell->m_targets.getUnitTarget(); + unit_target = spell->m_targets.GetUnitTarget(); //10% chance to play special pet attack talk, else growl //actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell @@ -769,7 +769,7 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) return; SpellCastTargets targets; - targets.read(recvPacket, caster); + targets.Read(recvPacket, caster); HandleClientCastFlags(recvPacket, castFlags, targets); caster->ClearUnitState(UNIT_STAT_FOLLOW); diff --git a/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp b/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp index e2f7f19ce79..b127831bad5 100755 --- a/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/SpellHandler.cpp @@ -32,14 +32,19 @@ #include "ScriptMgr.h" #include "GameObjectAI.h" -void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets & targets) +void WorldSession::HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets) { // some spell cast packet including more data (for projectiles?) if (castFlags & 0x02) { // not sure about these two - recvPacket >> targets.m_elevation; - recvPacket >> targets.m_speed; + float elevation, speed; + recvPacket >> elevation; + recvPacket >> speed; + + targets.SetElevation(elevation); + targets.SetSpeed(speed); + uint8 hasMovementData; recvPacket >> hasMovementData; if (hasMovementData) @@ -156,10 +161,10 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) } SpellCastTargets targets; - targets.read(recvPacket, pUser); + targets.Read(recvPacket, pUser); HandleClientCastFlags(recvPacket, castFlags, targets); - if (!pItem->IsTargetValidForItemUse(targets.getUnitTarget())) + if (!pItem->IsTargetValidForItemUse(targets.GetUnitTarget())) { // free gray item after use fail pUser->SendEquipError(EQUIP_ERR_NONE, pItem, NULL); @@ -168,7 +173,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) if (SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellId)) { // for implicit area/coord target spells - if (!targets.getUnitTarget()) + if (!targets.GetUnitTarget()) Spell::SendCastResult(_player, spellInfo, castCount, SPELL_FAILED_NO_VALID_TARGETS); // for explicit target spells else @@ -384,13 +389,13 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) // client provided targets SpellCastTargets targets; - targets.read(recvPacket, mover); + targets.Read(recvPacket, mover); HandleClientCastFlags(recvPacket, castFlags, targets); // auto-selection buff level base at target level (in spellInfo) - if (targets.getUnitTarget()) + if (targets.GetUnitTarget()) { - SpellEntry const *actualSpellInfo = sSpellMgr->SelectAuraRankForPlayerLevel(spellInfo, targets.getUnitTarget()->getLevel()); + SpellEntry const *actualSpellInfo = sSpellMgr->SelectAuraRankForPlayerLevel(spellInfo, targets.GetUnitTarget()->getLevel()); // if rank not found then function return NULL but in explicit cast case original spell can be casted and later failed with appropriate error message if (actualSpellInfo) diff --git a/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp b/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp index 9200f145d36..6eb2dbd7084 100755 --- a/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/TradeHandler.cpp @@ -353,7 +353,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) my_spell = new Spell(_player, spellEntry, true); my_spell->m_CastItem = castItem; - my_targets.setTradeItemTarget(_player); + my_targets.SetTradeItemTarget(_player); my_spell->m_targets = my_targets; SpellCastResult res = my_spell->CheckCast(true); @@ -388,7 +388,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/) his_spell = new Spell(trader, spellEntry, true); his_spell->m_CastItem = castItem; - his_targets.setTradeItemTarget(trader); + his_targets.SetTradeItemTarget(trader); his_spell->m_targets = his_targets; SpellCastResult res = his_spell->CheckCast(true); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index bdfb6f210ef..a0544b96e60 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2421,7 +2421,7 @@ void AuraEffect::HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, boo for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++) { if ((*iter)->GetCurrentSpell(i) - && (*iter)->GetCurrentSpell(i)->m_targets.getUnitTargetGUID() == target->GetGUID()) + && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == target->GetGUID()) { (*iter)->InterruptSpell(CurrentSpellTypes(i), false); } @@ -4778,7 +4778,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool // AT REMOVE else { - if ((IsQuestTameSpell(GetId())) && caster && caster->isAlive() && target->isAlive()) + if ((IsQuestTameSpell(GetSpellProto())) && caster && caster->isAlive() && target->isAlive()) { uint32 finalSpelId = 0; switch(GetId()) @@ -5409,7 +5409,6 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply) { uint64 casterGUID = IsSpellRequiringFocusedTarget(GetSpellProto()) ? GetCasterGUID() : target->GetGUID(); - // change the stack amount to be equal to stack amount of our aura if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID)) triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount()); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 2f1bab3f9fc..6a06d4d3a46 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -1,9 +1,25 @@ +/* + * Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ #ifndef TRINITY_SPELLAURAEFFECTS_H #define TRINITY_SPELLAURAEFFECTS_H class Unit; -class DynamicObject; class AuraEffect; class Aura; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c4872841dc7..bf444f27e86 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -53,18 +53,8 @@ #include "SpellScript.h" #include "InstanceScript.h" -#define SPELL_CHANNEL_UPDATE_INTERVAL (1 * IN_MILLISECONDS) - extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS]; -bool IsQuestTameSpell(uint32 spellId) -{ - SpellEntry const *spellproto = sSpellStore.LookupEntry(spellId); - if (!spellproto) return false; - - return spellproto->Effect[0] == SPELL_EFFECT_THREAT && spellproto->Effect[1] == SPELL_EFFECT_APPLY_AURA && spellproto->EffectApplyAuraName[1] == SPELL_AURA_DUMMY; -} - SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0) { m_unitTarget = NULL; @@ -91,7 +81,153 @@ SpellCastTargets::~SpellCastTargets() { } -void SpellCastTargets::setUnitTarget(Unit* target) +SpellCastTargets& SpellCastTargets::operator=(const SpellCastTargets &target) +{ + m_unitTarget = target.m_unitTarget; + m_itemTarget = target.m_itemTarget; + m_GOTarget = target.m_GOTarget; + + m_unitTargetGUID = target.m_unitTargetGUID; + m_GOTargetGUID = target.m_GOTargetGUID; + m_CorpseTargetGUID = target.m_CorpseTargetGUID; + m_itemTargetGUID = target.m_itemTargetGUID; + + m_itemTargetEntry = target.m_itemTargetEntry; + + m_srcTransGUID = target.m_srcTransGUID; + m_srcTransOffset = target.m_srcTransOffset; + m_srcPos = target.m_srcPos; + + m_dstTransGUID = target.m_dstTransGUID; + m_dstTransOffset = target.m_dstTransOffset; + m_dstPos = target.m_dstPos; + + m_elevation = target.m_elevation; + m_speed = target.m_speed; + + m_strTarget = target.m_strTarget; + + m_targetMask = target.m_targetMask; + + return *this; +} + +void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) +{ + data >> m_targetMask; + + if (m_targetMask == TARGET_FLAG_SELF) + return; + + if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNK17)) + data.readPackGUID(m_unitTargetGUID); + + if (m_targetMask & (TARGET_FLAG_OBJECT)) + data.readPackGUID(m_GOTargetGUID); + + if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) + data.readPackGUID(m_itemTargetGUID); + + if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE)) + data.readPackGUID(m_CorpseTargetGUID); + + if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) + { + data.readPackGUID(m_srcTransGUID); + if (m_srcTransGUID) + data >> m_srcTransOffset.PositionXYZStream(); + else + data >> m_srcPos.PositionXYZStream(); + } + else + { + m_srcTransGUID = caster->GetTransGUID(); + if (m_srcTransGUID) + m_srcTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); + else + m_srcPos.Relocate(caster); + } + + if (m_targetMask & TARGET_FLAG_DEST_LOCATION) + { + data.readPackGUID(m_dstTransGUID); + if (m_dstTransGUID) + data >> m_dstTransOffset.PositionXYZStream(); + else + data >> m_dstPos.PositionXYZStream(); + } + else + { + m_dstTransGUID = caster->GetTransGUID(); + if (m_dstTransGUID) + m_dstTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); + else + m_dstPos.Relocate(caster); + } + + if (m_targetMask & TARGET_FLAG_STRING) + data >> m_strTarget; + + Update(caster); +} + +void SpellCastTargets::Write(ByteBuffer& data) +{ + data << uint32(m_targetMask); + + if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK17)) + { + if (m_targetMask & TARGET_FLAG_UNIT) + { + if (m_unitTarget) + data.append(m_unitTarget->GetPackGUID()); + else + data << uint8(0); + } + else if (m_targetMask & TARGET_FLAG_OBJECT) + { + if (m_GOTarget) + data.append(m_GOTarget->GetPackGUID()); + else + data << uint8(0); + } + else if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE)) + data.appendPackGUID(m_CorpseTargetGUID); + else + data << uint8(0); + } + + if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) + { + if (m_itemTarget) + data.append(m_itemTarget->GetPackGUID()); + else + data << uint8(0); + } + + if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) + { + data.appendPackGUID(m_srcTransGUID); // relative position guid here - transport for example + if (m_srcTransGUID) + data << m_srcTransOffset.PositionXYZStream(); + else + data << m_srcPos.PositionXYZStream(); + } + + if (m_targetMask & TARGET_FLAG_DEST_LOCATION) + { + data.appendPackGUID(m_dstTransGUID); // relative position guid here - transport for example + if (m_dstTransGUID) + data << m_dstTransOffset.PositionXYZStream(); + else + data << m_dstPos.PositionXYZStream(); + } + + if (m_targetMask & TARGET_FLAG_STRING) + data << m_strTarget; +} + +void SpellCastTargets::SetUnitTarget(Unit* target) { if (!target) return; @@ -101,21 +237,26 @@ void SpellCastTargets::setUnitTarget(Unit* target) m_targetMask |= TARGET_FLAG_UNIT; } -void SpellCastTargets::setSrc(float x, float y, float z) +Position const* SpellCastTargets::GetSrc() const +{ + return &m_srcPos; +} + +void SpellCastTargets::SetSrc(float x, float y, float z) { m_srcPos.Relocate(x, y, z); m_srcTransGUID = 0; m_targetMask |= TARGET_FLAG_SOURCE_LOCATION; } -void SpellCastTargets::setSrc(Position &pos) +void SpellCastTargets::SetSrc(Position const& pos) { m_srcPos.Relocate(pos); m_srcTransGUID = 0; m_targetMask |= TARGET_FLAG_SOURCE_LOCATION; } -void SpellCastTargets::setSrc(WorldObject &wObj) +void SpellCastTargets::SetSrc(WorldObject const& wObj) { uint64 guid = wObj.GetTransGUID(); m_srcTransGUID = guid; @@ -124,7 +265,7 @@ void SpellCastTargets::setSrc(WorldObject &wObj) m_targetMask |= TARGET_FLAG_SOURCE_LOCATION; } -void SpellCastTargets::modSrc(Position &pos) +void SpellCastTargets::ModSrc(Position const& pos) { ASSERT(m_targetMask & TARGET_FLAG_SOURCE_LOCATION); @@ -137,7 +278,12 @@ void SpellCastTargets::modSrc(Position &pos) m_srcPos.Relocate(pos); } -void SpellCastTargets::setDst(float x, float y, float z, float orientation, uint32 mapId) +WorldLocation const* SpellCastTargets::GetDst() const +{ + return &m_dstPos; +} + +void SpellCastTargets::SetDst(float x, float y, float z, float orientation, uint32 mapId) { m_dstPos.Relocate(x, y, z, orientation); m_dstTransGUID = 0; @@ -146,14 +292,14 @@ void SpellCastTargets::setDst(float x, float y, float z, float orientation, uint m_dstPos.m_mapId = mapId; } -void SpellCastTargets::setDst(Position &pos) +void SpellCastTargets::SetDst(Position const& pos) { m_dstPos.Relocate(pos); m_dstTransGUID = 0; m_targetMask |= TARGET_FLAG_DEST_LOCATION; } -void SpellCastTargets::setDst(WorldObject &wObj) +void SpellCastTargets::SetDst(WorldObject const& wObj) { uint64 guid = wObj.GetTransGUID(); m_dstTransGUID = guid; @@ -162,7 +308,7 @@ void SpellCastTargets::setDst(WorldObject &wObj) m_targetMask |= TARGET_FLAG_DEST_LOCATION; } -void SpellCastTargets::setDst(SpellCastTargets &spellTargets) +void SpellCastTargets::SetDst(SpellCastTargets const& spellTargets) { m_dstTransGUID = spellTargets.m_dstTransGUID; m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset); @@ -170,7 +316,7 @@ void SpellCastTargets::setDst(SpellCastTargets &spellTargets) m_targetMask |= TARGET_FLAG_DEST_LOCATION; } -void SpellCastTargets::modDst(Position &pos) +void SpellCastTargets::ModDst(Position const& pos) { ASSERT(m_targetMask & TARGET_FLAG_DEST_LOCATION); @@ -183,14 +329,14 @@ void SpellCastTargets::modDst(Position &pos) m_dstPos.Relocate(pos); } -void SpellCastTargets::setGOTarget(GameObject *target) +void SpellCastTargets::SetGOTarget(GameObject* target) { m_GOTarget = target; m_GOTargetGUID = target->GetGUID(); m_targetMask |= TARGET_FLAG_OBJECT; } -void SpellCastTargets::setItemTarget(Item* item) +void SpellCastTargets::SetItemTarget(Item* item) { if (!item) return; @@ -201,7 +347,7 @@ void SpellCastTargets::setItemTarget(Item* item) m_targetMask |= TARGET_FLAG_ITEM; } -void SpellCastTargets::setTradeItemTarget(Player* caster) +void SpellCastTargets::SetTradeItemTarget(Player* caster) { m_itemTargetGUID = uint64(TRADE_SLOT_NONTRADED); m_itemTargetEntry = 0; @@ -210,7 +356,16 @@ void SpellCastTargets::setTradeItemTarget(Player* caster) Update(caster); } -void SpellCastTargets::setCorpseTarget(Corpse* corpse) +void SpellCastTargets::UpdateTradeSlotItem() +{ + if (m_itemTarget && (m_targetMask & TARGET_FLAG_TRADE_ITEM)) + { + m_itemTargetGUID = m_itemTarget->GetGUID(); + m_itemTargetEntry = m_itemTarget->GetEntry(); + } +} + +void SpellCastTargets::SetCorpseTarget(Corpse* corpse) { m_CorpseTargetGUID = corpse->GetGUID(); } @@ -255,7 +410,7 @@ void SpellCastTargets::Update(Unit* caster) } } -void SpellCastTargets::OutDebug() +void SpellCastTargets::OutDebug() const { if (!m_targetMask) sLog->outString("TARGET_FLAG_SELF"); @@ -284,121 +439,6 @@ void SpellCastTargets::OutDebug() sLog->outString("elevation: %f", m_elevation); } -void SpellCastTargets::read (ByteBuffer & data, Unit* caster) -{ - data >> m_targetMask; - - if (m_targetMask == TARGET_FLAG_SELF) - return; - - if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNK17)) - data.readPackGUID(m_unitTargetGUID); - - if (m_targetMask & (TARGET_FLAG_OBJECT)) - data.readPackGUID(m_GOTargetGUID); - - if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) - data.readPackGUID(m_itemTargetGUID); - - if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE)) - data.readPackGUID(m_CorpseTargetGUID); - - if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) - { - data.readPackGUID(m_srcTransGUID); - if (m_srcTransGUID) - data >> m_srcTransOffset.PositionXYZStream(); - else - data >> m_srcPos.PositionXYZStream(); - } - else - { - m_srcTransGUID = caster->GetTransGUID(); - if (m_srcTransGUID) - m_srcTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); - else - m_srcPos.Relocate(caster); - } - - if (m_targetMask & TARGET_FLAG_DEST_LOCATION) - { - data.readPackGUID(m_dstTransGUID); - if (m_dstTransGUID) - data >> m_dstTransOffset.PositionXYZStream(); - else - data >> m_dstPos.PositionXYZStream(); - } - else - { - m_dstTransGUID = caster->GetTransGUID(); - if (m_dstTransGUID) - m_dstTransOffset.Relocate(caster->GetTransOffsetX(), caster->GetTransOffsetY(), caster->GetTransOffsetZ(), caster->GetTransOffsetO()); - else - m_dstPos.Relocate(caster); - } - - if (m_targetMask & TARGET_FLAG_STRING) - data >> m_strTarget; - - Update(caster); -} - -void SpellCastTargets::write (ByteBuffer & data) -{ - data << uint32(m_targetMask); - - if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK17)) - { - if (m_targetMask & TARGET_FLAG_UNIT) - { - if (m_unitTarget) - data.append(m_unitTarget->GetPackGUID()); - else - data << uint8(0); - } - else if (m_targetMask & TARGET_FLAG_OBJECT) - { - if (m_GOTarget) - data.append(m_GOTarget->GetPackGUID()); - else - data << uint8(0); - } - else if (m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE)) - data.appendPackGUID(m_CorpseTargetGUID); - else - data << uint8(0); - } - - if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) - { - if (m_itemTarget) - data.append(m_itemTarget->GetPackGUID()); - else - data << uint8(0); - } - - if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) - { - data.appendPackGUID(m_srcTransGUID); // relative position guid here - transport for example - if (m_srcTransGUID) - data << m_srcTransOffset.PositionXYZStream(); - else - data << m_srcPos.PositionXYZStream(); - } - - if (m_targetMask & TARGET_FLAG_DEST_LOCATION) - { - data.appendPackGUID(m_dstTransGUID); // relative position guid here - transport for example - if (m_dstTransGUID) - data << m_dstTransOffset.PositionXYZStream(); - else - data << m_dstPos.PositionXYZStream(); - } - - if (m_targetMask & TARGET_FLAG_STRING) - data << m_strTarget; -} - Spell::Spell(Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID, bool skipCheck): m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, Caster)), m_caster(Caster), m_spellValue(new SpellValue(m_spellInfo)) @@ -593,8 +633,8 @@ void Spell::SelectSpellTargets() if (effectTargetType == SPELL_REQUIRE_CASTER) AddUnitTarget(m_caster, i); else if (effectTargetType == SPELL_REQUIRE_ITEM) - if (m_targets.getItemTarget()) - AddItemTarget(m_targets.getItemTarget(), i); + if (m_targets.GetItemTarget()) + AddItemTarget(m_targets.GetItemTarget(), i); continue; } @@ -632,7 +672,7 @@ void Spell::SelectSpellTargets() AddUnitTarget((Unit*)result, i); break; case TYPEID_CORPSE: - m_targets.setCorpseTarget((Corpse*)result); + m_targets.SetCorpseTarget((Corpse*)result); if (Player* owner = ObjectAccessor::FindPlayer(((Corpse*)result)->GetOwnerGUID())) AddUnitTarget(owner, i); break; @@ -651,8 +691,8 @@ void Spell::SelectSpellTargets() break; } default: - if (m_targets.getUnitTarget()) - AddUnitTarget(m_targets.getUnitTarget(), i); + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); else AddUnitTarget(m_caster, i); break; @@ -670,8 +710,8 @@ void Spell::SelectSpellTargets() case SPELL_EFFECT_REPUTATION: case SPELL_EFFECT_LEARN_SPELL: case SPELL_EFFECT_SEND_TAXI: - if (m_targets.getUnitTarget()) - AddUnitTarget(m_targets.getUnitTarget(), i); + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); // Triggered spells have additional spell targets - cast them even if no explicit unit target is given (required for spell 50516 for example) else if (m_spellInfo->Effect[i] == SPELL_EFFECT_TRIGGER_SPELL) AddUnitTarget(m_caster, i); @@ -685,11 +725,11 @@ void Spell::SelectSpellTargets() } break; case SPELL_EFFECT_RESURRECT_NEW: - if (m_targets.getUnitTarget()) - AddUnitTarget(m_targets.getUnitTarget(), i); - if (m_targets.getCorpseTargetGUID()) + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); + if (m_targets.GetCorpseTargetGUID()) { - Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.getCorpseTargetGUID()); + Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID()); if (corpse) { Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID()); @@ -719,8 +759,8 @@ void Spell::SelectSpellTargets() AddUnitTarget(m_caster, i); break; default: // apply to target in other case - if (m_targets.getUnitTarget()) - AddUnitTarget(m_targets.getUnitTarget(), i); + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); break; } break; @@ -730,11 +770,11 @@ void Spell::SelectSpellTargets() SelectEffectTargets(i, TARGET_UNIT_PARTY_TARGET); break; case SPELL_EFFECT_SKIN_PLAYER_CORPSE: - if (m_targets.getUnitTarget()) - AddUnitTarget(m_targets.getUnitTarget(), i); - else if (m_targets.getCorpseTargetGUID()) + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); + else if (m_targets.GetCorpseTargetGUID()) { - Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.getCorpseTargetGUID()); + Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID()); if (corpse) { Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID()); @@ -795,7 +835,7 @@ void Spell::SelectSpellTargets() } else if (m_spellInfo->speed > 0.0f) { - float dist = m_caster->GetDistance(m_targets.m_dstPos); + float dist = m_caster->GetDistance(*m_targets.GetDst()); m_delayMoment = (uint64) floor(dist / m_spellInfo->speed * 1000.0f); } } @@ -1154,7 +1194,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) } // Do not take combo points on dodge and miss - if (m_needComboPoints && m_targets.getUnitTargetGUID() == target->targetGUID) + if (m_needComboPoints && m_targets.GetUnitTargetGUID() == target->targetGUID) if (missInfo != SPELL_MISS_NONE) { m_needComboPoints = false; @@ -1681,7 +1721,7 @@ struct ChainHealingOrder : public std::binary_function<const Unit*, const Unit*, void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uint32 num, SpellTargets TargetType) { - Unit *cur = m_targets.getUnitTarget(); + Unit *cur = m_targets.GetUnitTarget(); if (!cur) return; @@ -1751,20 +1791,20 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, SpellNo if (TargetType == SPELL_TARGETS_GO) return; - Position *pos; + Position const* pos; switch(type) { case PUSH_DST_CENTER: CheckDst(); - pos = &m_targets.m_dstPos; + pos = m_targets.GetDst(); break; case PUSH_SRC_CENTER: CheckSrc(); - pos = &m_targets.m_srcPos; + pos = m_targets.GetSrc(); break; case PUSH_CHAIN: { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target) { sLog->outError("SPELL: cannot find unit target for spell ID %u\n", m_spellInfo->Id); @@ -1793,16 +1833,16 @@ void Spell::SearchGOAreaTarget(std::list<GameObject*> &TagGOMap, float radius, S if (TargetType != SPELL_TARGETS_GO) return; - Position *pos; + Position const* pos; switch (type) { case PUSH_DST_CENTER: CheckDst(); - pos = &m_targets.m_dstPos; + pos = m_targets.GetDst(); break; case PUSH_SRC_CENTER: CheckSrc(); - pos = &m_targets.m_srcPos; + pos = m_targets.GetSrc(); break; default: pos = m_caster; @@ -1873,8 +1913,8 @@ WorldObject* Spell::SearchNearbyTarget(float range, SpellTargets TargetType, Spe } break; case SPELL_TARGET_TYPE_CREATURE: - if (m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetEntry() == (*i_spellST)->mConditionValue2) - return m_targets.getUnitTarget(); + if (m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetEntry() == (*i_spellST)->mConditionValue2) + return m_targets.GetUnitTarget(); case SPELL_TARGET_TYPE_DEAD: default: if (Creature *cre = m_caster->FindNearestCreature((*i_spellST)->mConditionValue2, range, (*i_spellST)->mConditionValue1 != SPELL_TARGET_TYPE_DEAD)) @@ -1935,7 +1975,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) float dis = (float)rand_norm() * (max_dis - min_dis) + min_dis; float x, y, z; m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE, dis); - m_targets.setDst(x, y, z, m_caster->GetOrientation()); + m_targets.SetDst(x, y, z, m_caster->GetOrientation()); break; } case TARGET_UNIT_MASTER: @@ -1977,7 +2017,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) case TARGET_TYPE_UNIT_TARGET: { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target) { sLog->outError("SPELL: no unit target for spell ID %u", m_spellInfo->Id); @@ -1989,14 +2029,14 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) case TARGET_UNIT_TARGET_ENEMY: if (Unit *magnet = m_caster->SelectMagnetTarget(target, m_spellInfo)) if (magnet != target) - m_targets.setUnitTarget(magnet); + m_targets.SetUnitTarget(magnet); pushType = PUSH_CHAIN; break; case TARGET_UNIT_TARGET_ANY: if (!IsPositiveSpell(m_spellInfo->Id)) if (Unit *magnet = m_caster->SelectMagnetTarget(target, m_spellInfo)) if (magnet != target) - m_targets.setUnitTarget(magnet); + m_targets.SetUnitTarget(magnet); pushType = PUSH_CHAIN; break; case TARGET_UNIT_CHAINHEAL: @@ -2054,8 +2094,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) { pushType = PUSH_CHAIN; - if (m_targets.getUnitTarget() != target) - m_targets.setUnitTarget((Unit*)target); + if (m_targets.GetUnitTarget() != target) + m_targets.SetUnitTarget((Unit*)target); } break; @@ -2082,12 +2122,12 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) { if (cur == TARGET_SRC_CASTER) { - m_targets.setSrc(*m_caster); + m_targets.SetSrc(*m_caster); break; } else if (cur == TARGET_DST_CASTER) { - m_targets.setDst(*m_caster); + m_targets.SetDst(*m_caster); break; } @@ -2124,14 +2164,14 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) m_caster->GetFirstCollisionPosition(pos, dist, angle); else m_caster->GetNearPosition(pos, dist, angle); - m_targets.setDst(*m_caster); - m_targets.modDst(pos); + m_targets.SetDst(*m_caster); + m_targets.ModDst(pos); break; } case TARGET_TYPE_DEST_TARGET: //2+8+2 { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target) { sLog->outError("SPELL: no unit target for spell ID %u", m_spellInfo->Id); @@ -2140,7 +2180,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) if (cur == TARGET_DST_TARGET_ENEMY || cur == TARGET_DEST_TARGET_ANY) { - m_targets.setDst(*target); + m_targets.SetDst(*target); break; } @@ -2168,8 +2208,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) Position pos; target->GetNearPosition(pos, dist, angle); - m_targets.setDst(*target); - m_targets.modDst(pos); + m_targets.SetDst(*target); + m_targets.ModDst(pos); break; } @@ -2209,9 +2249,9 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) dist *= (float)rand_norm(); // must has dst, no need to set flag - Position pos = m_targets.m_dstPos; + Position pos = *m_targets.GetDst(); m_caster->MovePosition(pos, dist, angle); - m_targets.modDst(pos); + m_targets.ModDst(pos); break; } @@ -2224,9 +2264,9 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) { //TODO: fix this check if (m_spellInfo->Effect[0] == SPELL_EFFECT_TELEPORT_UNITS || m_spellInfo->Effect[1] == SPELL_EFFECT_TELEPORT_UNITS || m_spellInfo->Effect[2] == SPELL_EFFECT_TELEPORT_UNITS) - m_targets.setDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation, (int32)st->target_mapId); + m_targets.SetDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation, (int32)st->target_mapId); else if (st->target_mapId == m_caster->GetMapId()) - m_targets.setDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation); + m_targets.SetDst(st->target_X, st->target_Y, st->target_Z, st->target_Orientation); } else { @@ -2234,12 +2274,12 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) Unit* target = NULL; if (uint64 guid = m_caster->GetUInt64Value(UNIT_FIELD_TARGET)) target = ObjectAccessor::GetUnit(*m_caster, guid); - m_targets.setDst(target ? *target : *m_caster); + m_targets.SetDst(target ? *target : *m_caster); } break; case TARGET_DST_HOME: if (m_caster->GetTypeId() == TYPEID_PLAYER) - m_targets.setDst(m_caster->ToPlayer()->m_homebindX, m_caster->ToPlayer()->m_homebindY, m_caster->ToPlayer()->m_homebindZ, m_caster->ToPlayer()->GetOrientation(), m_caster->ToPlayer()->m_homebindMapId); + m_targets.SetDst(m_caster->ToPlayer()->m_homebindX, m_caster->ToPlayer()->m_homebindY, m_caster->ToPlayer()->m_homebindZ, m_caster->ToPlayer()->GetOrientation(), m_caster->ToPlayer()->m_homebindMapId); break; case TARGET_DST_NEARBY_ENTRY: { @@ -2247,7 +2287,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) if (modOwner) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this); if (WorldObject *target = SearchNearbyTarget(range, SPELL_TARGETS_ENTRY, SpellEffIndex(i))) - m_targets.setDst(*target); + m_targets.SetDst(*target); break; } } @@ -2266,21 +2306,21 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) { case TARGET_UNIT_CHANNEL_TARGET: // unit target may be no longer avalible - teleported out of map for example - if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID())) + if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.GetUnitTargetGUID())) AddUnitTarget(target, i); else sLog->outError("SPELL: cannot find channel spell target for spell ID %u", m_spellInfo->Id); break; case TARGET_DEST_CHANNEL_TARGET: if (m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.HasDst()) - m_targets.setDst(m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets); - else if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID())) - m_targets.setDst(*target); + m_targets.SetDst(m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets); + else if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.GetUnitTargetGUID())) + m_targets.SetDst(*target); else sLog->outError("SPELL: cannot find channel spell destination for spell ID %u", m_spellInfo->Id); break; case TARGET_DEST_CHANNEL_CASTER: - m_targets.setDst(*m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->GetCaster()); + m_targets.SetDst(*m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->GetCaster()); break; } break; @@ -2291,17 +2331,17 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) switch (cur) { case TARGET_GAMEOBJECT: - if (m_targets.getGOTarget()) - AddGOTarget(m_targets.getGOTarget(), i); + if (m_targets.GetGOTarget()) + AddGOTarget(m_targets.GetGOTarget(), i); break; case TARGET_GAMEOBJECT_ITEM: - if (m_targets.getGOTargetGUID()) - AddGOTarget(m_targets.getGOTarget(), i); - else if (m_targets.getItemTarget()) - AddItemTarget(m_targets.getItemTarget(), i); + if (m_targets.GetGOTargetGUID()) + AddGOTarget(m_targets.GetGOTarget(), i); + else if (m_targets.GetItemTarget()) + AddItemTarget(m_targets.GetItemTarget(), i); break; case TARGET_UNIT_DRIVER: - if (Unit* driver = m_targets.getUnitTarget()) + if (Unit* driver = m_targets.GetUnitTarget()) if (driver->IsOnVehicle(m_caster)) AddUnitTarget(driver, i); break; @@ -2316,7 +2356,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) if (pushType == PUSH_CHAIN) // Chain { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target) { sLog->outError("SPELL: no chain unit target for spell ID %u", m_spellInfo->Id); @@ -2449,7 +2489,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) switch(result->GetTypeId()) { case TYPEID_UNIT: - m_targets.setDst(*result); + m_targets.SetDst(*result); break; default: break; @@ -2464,13 +2504,13 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) case 51327: case 51328: // Search for ghoul if our ghoul or dead body not valid unit target - if (!(m_targets.getUnitTarget() && ((m_targets.getUnitTarget()->GetEntry() == 26125 && m_targets.getUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()) - || (m_targets.getUnitTarget()->getDeathState() == CORPSE - && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId() - && m_targets.getUnitTarget()->GetTypeId() == TYPEID_UNIT - && !m_targets.getUnitTarget()->ToCreature()->isDeadByDefault() - && !(m_targets.getUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) - && m_targets.getUnitTarget()->GetDisplayId() == m_targets.getUnitTarget()->GetNativeDisplayId())))) + if (!(m_targets.GetUnitTarget() && ((m_targets.GetUnitTarget()->GetEntry() == 26125 && m_targets.GetUnitTarget()->GetOwnerGUID() == m_caster->GetGUID()) + || (m_targets.GetUnitTarget()->getDeathState() == CORPSE + && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId() + && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT + && !m_targets.GetUnitTarget()->ToCreature()->isDeadByDefault() + && !(m_targets.GetUnitTarget()->GetCreatureTypeMask() & CREATURE_TYPEMASK_MECHANICAL_OR_ELEMENTAL) + && m_targets.GetUnitTarget()->GetDisplayId() == m_targets.GetUnitTarget()->GetNativeDisplayId())))) { CleanupTargetList(); @@ -2482,7 +2522,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) { case TYPEID_UNIT: case TYPEID_PLAYER: - m_targets.setUnitTarget((Unit*)result); + m_targets.SetUnitTarget((Unit*)result); break; default: break; @@ -2548,7 +2588,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) m_caster->GetPartyMemberInDist(unitList, radius); //fix me break; case TARGET_UNIT_PARTY_TARGET: - m_targets.getUnitTarget()->GetPartyMemberInDist(unitList, radius); + m_targets.GetUnitTarget()->GetPartyMemberInDist(unitList, radius); break; case TARGET_UNIT_PARTY_CASTER: m_caster->GetPartyMemberInDist(unitList, radius); @@ -2558,8 +2598,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) break; case TARGET_UNIT_CLASS_TARGET: { - Player* targetPlayer = m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER - ? (Player*)m_targets.getUnitTarget() : NULL; + Player* targetPlayer = m_targets.GetUnitTarget() && m_targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER + ? (Player*)m_targets.GetUnitTarget() : NULL; Group* pGroup = targetPlayer ? targetPlayer->GetGroup() : NULL; if (pGroup) @@ -2573,8 +2613,8 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) AddUnitTarget(Target, i); } } - else if (m_targets.getUnitTarget()) - AddUnitTarget(m_targets.getUnitTarget(), i); + else if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); break; } } @@ -2711,7 +2751,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) maxTargets += (*j)->GetAmount(); if (m_spellInfo->Id == 5246) //Intimidating Shout - unitList.remove(m_targets.getUnitTarget()); + unitList.remove(m_targets.GetUnitTarget()); Trinity::RandomResizeList(unitList, maxTargets); } @@ -2747,7 +2787,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered m_targets = *targets; - if (!m_targets.getUnitTargetGUID() && m_spellInfo->Targets & TARGET_FLAG_UNIT) + if (!m_targets.GetUnitTargetGUID() && m_spellInfo->Targets & TARGET_FLAG_UNIT) { Unit* target = NULL; if (m_caster->GetTypeId() == TYPEID_UNIT) @@ -2756,7 +2796,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered target = ObjectAccessor::GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection()); if (target && IsValidSingleTargetSpell(target)) - m_targets.setUnitTarget(target); + m_targets.SetUnitTarget(target); else { SendCastResult(SPELL_FAILED_BAD_TARGETS); @@ -2778,11 +2818,11 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered } } if (!m_targets.HasSrc() && m_spellInfo->Targets & TARGET_FLAG_SOURCE_LOCATION) - m_targets.setSrc(*m_caster); + m_targets.SetSrc(*m_caster); if (!m_targets.HasDst() && m_spellInfo->Targets & TARGET_FLAG_DEST_LOCATION) { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target) { if (m_caster->GetTypeId() == TYPEID_UNIT) @@ -2792,7 +2832,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered } if (target) - m_targets.setDst(*target); + m_targets.SetDst(*target); else { SendCastResult(SPELL_FAILED_BAD_TARGETS); @@ -2894,7 +2934,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered // set timer base at cast time ReSetTimer(); - sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::prepare: spell id %u source %u caster %d triggered %u mask %u", m_spellInfo->Id, m_caster->GetEntry(), m_originalCaster ? m_originalCaster->GetEntry() : -1, m_IsTriggeredSpell ? 1 : 0, m_targets.getTargetMask()); + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::prepare: spell id %u source %u caster %d triggered %u mask %u", m_spellInfo->Id, m_caster->GetEntry(), m_originalCaster ? m_originalCaster->GetEntry() : -1, m_IsTriggeredSpell ? 1 : 0, m_targets.GetTargetMask()); //Containers for channeled spells have to be set //TODO:Apply this to all casted spells if needed @@ -2989,7 +3029,7 @@ void Spell::cast(bool skipCheck) // update pointers base at GUIDs to prevent access to non-existed already object UpdatePointers(); - if (Unit* target = m_targets.getUnitTarget()) + if (Unit* target = m_targets.GetUnitTarget()) { // three check: prepare, cast (m_casttime > 0), hit (delayed) if (m_casttime && target->isAlive() && !target->IsFriendlyTo(m_caster) && !m_caster->canSeeOrDetect(target)) @@ -3003,7 +3043,7 @@ void Spell::cast(bool skipCheck) else { // cancel at lost main target unit - if (m_targets.getUnitTargetGUID() && m_targets.getUnitTargetGUID() != m_caster->GetGUID()) + if (m_targets.GetUnitTargetGUID() && m_targets.GetUnitTargetGUID() != m_caster->GetGUID()) { cancel(); return; @@ -3017,8 +3057,8 @@ void Spell::cast(bool skipCheck) SetExecutedCurrently(true); - if (m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.getUnitTarget() && m_targets.getUnitTarget() != m_caster) - m_caster->SetInFront(m_targets.getUnitTarget()); + if (m_caster->GetTypeId() != TYPEID_PLAYER && m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster) + m_caster->SetInFront(m_targets.GetUnitTarget()); // Should this be done for original caster? if (m_caster->GetTypeId() == TYPEID_PLAYER) @@ -3051,7 +3091,7 @@ void Spell::cast(bool skipCheck) // additional check after cast bar completes (must not be in CheckCast) // if trade not complete then remember it in trade data - if (m_targets.getTargetMask() & TARGET_FLAG_TRADE_ITEM) + if (m_targets.GetTargetMask() & TARGET_FLAG_TRADE_ITEM) { if (m_caster->GetTypeId() == TYPEID_PLAYER) { @@ -3122,7 +3162,7 @@ void Spell::cast(bool skipCheck) // traded items have trade slot instead of guid in m_itemTargetGUID // set to real guid to be sent later to the client - m_targets.updateTradeSlotItem(); + m_targets.UpdateTradeSlotItem(); if (m_caster->GetTypeId() == TYPEID_PLAYER) { @@ -3141,7 +3181,7 @@ void Spell::cast(bool skipCheck) TakePower(); TakeReagents(); // we must remove reagents before HandleEffects to allow place crafted item in same slot } - else if (Item* targetItem = m_targets.getItemTarget()) + else if (Item* targetItem = m_targets.GetItemTarget()) { /// Not own traded item (in trader trade slot) req. reagents including triggered spell case if (targetItem->GetOwnerGUID() != m_caster->GetGUID()) @@ -3221,7 +3261,7 @@ void Spell::cast(bool skipCheck) if (*i < 0) m_caster->RemoveAurasDueToSpell(-(*i)); else - m_caster->CastSpell(m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster, *i, true); + m_caster->CastSpell(m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster, *i, true); } } @@ -3386,7 +3426,7 @@ void Spell::_handle_immediate_phase() if (EffectTargetType[m_spellInfo->Effect[j]] == SPELL_REQUIRE_DEST) { if (!m_targets.HasDst()) // FIXME: this will ignore dest set in effect - m_targets.setDst(*m_caster); + m_targets.SetDst(*m_caster); HandleEffects(m_originalCaster, NULL, NULL, j); m_effectMask |= (1<<j); } @@ -3471,7 +3511,7 @@ void Spell::update(uint32 difftime) // update pointers based at it's GUIDs UpdatePointers(); - if (m_targets.getUnitTargetGUID() && !m_targets.getUnitTarget()) + if (m_targets.GetUnitTargetGUID() && !m_targets.GetUnitTarget()) { sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell %u is cancelled due to removal of target.", m_spellInfo->Id); cancel(); @@ -3765,7 +3805,7 @@ void Spell::SendSpellStart() data << uint32(castFlags); // cast flags data << uint32(m_timer); // delay? - m_targets.write(data); + m_targets.Write(data); if (castFlags & CAST_FLAG_POWER_LEFT_SELF) data << uint32(m_caster->GetPower((Powers)m_spellInfo->powerType)); @@ -3835,15 +3875,15 @@ void Spell::SendSpellGo() /* // statement below seems to be wrong - i've seen spells with both unit and dest target // Can't have TARGET_FLAG_UNIT when *_LOCATION is present - it breaks missile visuals - if (m_targets.getTargetMask() & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION)) - m_targets.setTargetMask(m_targets.getTargetMask() & ~TARGET_FLAG_UNIT); + if (m_targets.GetTargetMask() & (TARGET_FLAG_SOURCE_LOCATION | TARGET_FLAG_DEST_LOCATION)) + m_targets.setTargetMask(m_targets.GetTargetMask() & ~TARGET_FLAG_UNIT); else if (m_targets.getIntTargetFlags() & FLAG_INT_UNIT) - m_targets.setTargetMask(m_targets.getTargetMask() | TARGET_FLAG_UNIT); + m_targets.setTargetMask(m_targets.GetTargetMask() | TARGET_FLAG_UNIT); */ WriteSpellGoTargets(&data); - m_targets.write(data); + m_targets.Write(data); if (castFlags & CAST_FLAG_POWER_LEFT_SELF) data << uint32(m_caster->GetPower((Powers)m_spellInfo->powerType)); @@ -3882,7 +3922,7 @@ void Spell::SendSpellGo() data << uint32(0); } - if (m_targets.getTargetMask() & TARGET_FLAG_DEST_LOCATION) + if (m_targets.GetTargetMask() & TARGET_FLAG_DEST_LOCATION) { data << uint8(0); } @@ -4271,9 +4311,9 @@ void Spell::TakeCastItem() uint32 count = 1; m_caster->ToPlayer()->DestroyItemCount(m_CastItem, count, true); - // prevent crash at access to deleted m_targets.getItemTarget - if (m_CastItem == m_targets.getItemTarget()) - m_targets.setItemTarget(NULL); + // prevent crash at access to deleted m_targets.GetItemTarget + if (m_CastItem == m_targets.GetItemTarget()) + m_targets.SetItemTarget(NULL); m_CastItem = NULL; } @@ -4288,7 +4328,7 @@ void Spell::TakePower() if (m_caster->GetTypeId() == TYPEID_PLAYER) { if (m_spellInfo->powerType == POWER_RAGE || m_spellInfo->powerType == POWER_ENERGY || m_spellInfo->powerType == POWER_RUNE) - if (uint64 targetGUID = m_targets.getUnitTargetGUID()) + if (uint64 targetGUID = m_targets.GetUnitTargetGUID()) for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) if (ihit->targetGUID == targetGUID) { @@ -4488,7 +4528,7 @@ void Spell::TakeReagents() { if (m_IsTriggeredSpell) // reagents used in triggered spell removed by original spell or don't must be removed. { - Item* targetItem = m_targets.getItemTarget(); + Item* targetItem = m_targets.GetItemTarget(); /// Not own traded item (in trader trade slot) req. reagents including triggered spell case if (!(targetItem && targetItem->GetOwnerGUID() != m_caster->GetGUID())) return; @@ -4534,9 +4574,9 @@ void Spell::TakeReagents() } } - // if getItemTarget is also spell reagent - if (m_targets.getItemTargetEntry() == itemid) - m_targets.setItemTarget(NULL); + // if GetItemTarget is also spell reagent + if (m_targets.GetItemTargetEntry() == itemid) + m_targets.SetItemTarget(NULL); p_caster->DestroyItemCount(itemid, itemcount, true); } @@ -4544,10 +4584,10 @@ void Spell::TakeReagents() void Spell::HandleThreatSpells(uint32 spellId) { - if (!m_targets.getUnitTarget() || !spellId) + if (!m_targets.GetUnitTarget() || !spellId) return; - if (!m_targets.getUnitTarget()->CanHaveThreatList()) + if (!m_targets.GetUnitTarget()->CanHaveThreatList()) return; uint16 threat = sSpellMgr->GetSpellThreat(spellId); @@ -4555,7 +4595,7 @@ void Spell::HandleThreatSpells(uint32 spellId) if (!threat) return; - m_targets.getUnitTarget()->AddThreat(m_caster, float(threat)); + m_targets.GetUnitTarget()->AddThreat(m_caster, float(threat)); sLog->outStaticDebug("Spell %u, rank %u, added an additional %i threat", spellId, sSpellMgr->GetSpellRank(spellId), threat); } @@ -4702,10 +4742,10 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_MOVING; } - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); // In pure self-cast spells, the client won't send any unit target - if (!target && (m_targets.getTargetMask() == TARGET_FLAG_SELF || m_targets.getTargetMask() & TARGET_FLAG_UNIT_CASTER)) // TARGET_FLAG_SELF == 0, remember! + if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_CASTER)) // TARGET_FLAG_SELF == 0, remember! target = m_caster; if (target) @@ -4779,12 +4819,12 @@ SpellCastResult Spell::CheckCast(bool strict) // Additional check for some spells // If 0 spell effect empty - client not send target data (need use selection) // TODO: check it on next client version - if (m_targets.getTargetMask() == TARGET_FLAG_SELF && + if (m_targets.GetTargetMask() == TARGET_FLAG_SELF && m_spellInfo->EffectImplicitTargetA[1] == TARGET_UNIT_TARGET_ENEMY) { target = m_caster->GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection()); if (target) - m_targets.setUnitTarget(target); + m_targets.SetUnitTarget(target); else return SPELL_FAILED_BAD_TARGETS; } @@ -4961,7 +5001,7 @@ SpellCastResult Spell::CheckCast(bool strict) { // spell different for friends and enemies // hurt version required facing - if (m_targets.getUnitTarget() && !m_caster->IsFriendlyTo(m_targets.getUnitTarget()) && !m_caster->HasInArc(static_cast<float>(M_PI), m_targets.getUnitTarget())) + if (m_targets.GetUnitTarget() && !m_caster->IsFriendlyTo(m_targets.GetUnitTarget()) && !m_caster->HasInArc(static_cast<float>(M_PI), m_targets.GetUnitTarget())) return SPELL_FAILED_UNIT_NOT_INFRONT; } else if (m_spellInfo->SpellIconID == 33 && m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_SHAMAN_FIRE_NOVA) @@ -4971,13 +5011,13 @@ SpellCastResult Spell::CheckCast(bool strict) } else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] == 0x2000) // Death Coil (DeathKnight) { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target || (target->IsFriendlyTo(m_caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)) return SPELL_FAILED_BAD_TARGETS; } else if (m_spellInfo->Id == 19938) // Awaken Peon { - Unit *unit = m_targets.getUnitTarget(); + Unit *unit = m_targets.GetUnitTarget(); if (!unit || !unit->HasAura(17743)) return SPELL_FAILED_BAD_TARGETS; } @@ -4991,7 +5031,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_DONT_REPORT; - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target || !target->IsFriendlyTo(m_caster) || target->getAttackers().empty()) return SPELL_FAILED_BAD_TARGETS; @@ -5053,7 +5093,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_BAD_TARGETS; - Item* foodItem = m_targets.getItemTarget(); + Item* foodItem = m_targets.GetItemTarget(); if (!foodItem) return SPELL_FAILED_BAD_TARGETS; @@ -5078,7 +5118,7 @@ SpellCastResult Spell::CheckCast(bool strict) { // Can be area effect, Check only for players and not check if target - caster (spell can have multiply drain/burn effects) if (m_caster->GetTypeId() == TYPEID_PLAYER) - if (Unit* target = m_targets.getUnitTarget()) + if (Unit* target = m_targets.GetUnitTarget()) if (target != m_caster && target->getPowerType() != Powers(m_spellInfo->EffectMiscValue[i])) return SPELL_FAILED_BAD_TARGETS; break; @@ -5097,20 +5137,20 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_SKINNING: { - if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.getUnitTarget() || m_targets.getUnitTarget()->GetTypeId() != TYPEID_UNIT) + if (m_caster->GetTypeId() != TYPEID_PLAYER || !m_targets.GetUnitTarget() || m_targets.GetUnitTarget()->GetTypeId() != TYPEID_UNIT) return SPELL_FAILED_BAD_TARGETS; - if (!(m_targets.getUnitTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_SKINNABLE)) + if (!(m_targets.GetUnitTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & UNIT_FLAG_SKINNABLE)) return SPELL_FAILED_TARGET_UNSKINNABLE; - Creature* creature = m_targets.getUnitTarget()->ToCreature(); + Creature* creature = m_targets.GetUnitTarget()->ToCreature(); if (creature->GetCreatureType() != CREATURE_TYPE_CRITTER && !creature->loot.isLooted()) return SPELL_FAILED_TARGET_NOT_LOOTED; uint32 skill = creature->GetCreatureInfo()->GetRequiredLootSkill(); int32 skillValue = m_caster->ToPlayer()->GetSkillValue(skill); - int32 TargetLevel = m_targets.getUnitTarget()->getLevel(); + int32 TargetLevel = m_targets.GetUnitTarget()->getLevel(); int32 ReqValue = (skillValue < 100 ? (TargetLevel-10) * 10 : TargetLevel * 5); if (ReqValue > skillValue) return SPELL_FAILED_LOW_CASTLEVEL; @@ -5131,39 +5171,39 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() != TYPEID_PLAYER // only players can open locks, gather etc. // we need a go target in case of TARGET_GAMEOBJECT - || (m_spellInfo->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT && !m_targets.getGOTarget())) + || (m_spellInfo->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT && !m_targets.GetGOTarget())) return SPELL_FAILED_BAD_TARGETS; Item *pTempItem = NULL; - if (m_targets.getTargetMask() & TARGET_FLAG_TRADE_ITEM) + if (m_targets.GetTargetMask() & TARGET_FLAG_TRADE_ITEM) { if (TradeData* pTrade = m_caster->ToPlayer()->GetTradeData()) - pTempItem = pTrade->GetTraderData()->GetItem(TradeSlots(m_targets.getItemTargetGUID())); + pTempItem = pTrade->GetTraderData()->GetItem(TradeSlots(m_targets.GetItemTargetGUID())); } - else if (m_targets.getTargetMask() & TARGET_FLAG_ITEM) - pTempItem = m_caster->ToPlayer()->GetItemByGuid(m_targets.getItemTargetGUID()); + else if (m_targets.GetTargetMask() & TARGET_FLAG_ITEM) + pTempItem = m_caster->ToPlayer()->GetItemByGuid(m_targets.GetItemTargetGUID()); // we need a go target, or an openable item target in case of TARGET_GAMEOBJECT_ITEM if (m_spellInfo->EffectImplicitTargetA[i] == TARGET_GAMEOBJECT_ITEM && - !m_targets.getGOTarget() && + !m_targets.GetGOTarget() && (!pTempItem || !pTempItem->GetTemplate()->LockID || !pTempItem->IsLocked())) return SPELL_FAILED_BAD_TARGETS; - if (m_spellInfo->Id != 1842 || (m_targets.getGOTarget() && - m_targets.getGOTarget()->GetGOInfo()->type != GAMEOBJECT_TYPE_TRAP)) + if (m_spellInfo->Id != 1842 || (m_targets.GetGOTarget() && + m_targets.GetGOTarget()->GetGOInfo()->type != GAMEOBJECT_TYPE_TRAP)) if (m_caster->ToPlayer()->InBattleground() && // In Battleground players can use only flags and banners !m_caster->ToPlayer()->CanUseBattlegroundObject()) return SPELL_FAILED_TRY_AGAIN; // get the lock entry uint32 lockId = 0; - if (GameObject* go = m_targets.getGOTarget()) + if (GameObject* go = m_targets.GetGOTarget()) { lockId = go->GetGOInfo()->GetLockId(); if (!lockId) return SPELL_FAILED_BAD_TARGETS; } - else if (Item* itm = m_targets.getItemTarget()) + else if (Item* itm = m_targets.GetItemTarget()) lockId = itm->GetTemplate()->LockID; SkillType skillId = SKILL_NONE; @@ -5218,11 +5258,11 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_CREATE_TAMED_PET: { - if (m_targets.getUnitTarget()) + if (m_targets.GetUnitTarget()) { - if (m_targets.getUnitTarget()->GetTypeId() != TYPEID_PLAYER) + if (m_targets.GetUnitTarget()->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_BAD_TARGETS; - if (m_targets.getUnitTarget()->GetPetGUID()) + if (m_targets.GetUnitTarget()->GetPetGUID()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; } break; @@ -5288,7 +5328,7 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_STEAL_BENEFICIAL_BUFF: { - if (m_targets.getUnitTarget() == m_caster) + if (m_targets.GetUnitTarget() == m_caster) return SPELL_FAILED_BAD_TARGETS; break; } @@ -5298,7 +5338,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->Id == 781 && !m_caster->isInCombat()) return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (m_caster == target && m_caster->HasUnitState(UNIT_STAT_ROOT)) { if (m_caster->GetTypeId() == TYPEID_PLAYER) @@ -5332,7 +5372,7 @@ SpellCastResult Spell::CheckCast(bool strict) // Tag Murloc case 30877: { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target || target->GetEntry() != 17326) return SPELL_FAILED_BAD_TARGETS; break; @@ -5346,10 +5386,10 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_BAD_TARGETS; - if (!m_targets.getUnitTarget() || m_targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER) + if (!m_targets.GetUnitTarget() || m_targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; - Creature* target = m_targets.getUnitTarget()->ToCreature(); + Creature* target = m_targets.GetUnitTarget()->ToCreature(); if (target->getLevel() > m_caster->getLevel()) return SPELL_FAILED_HIGHLEVEL; @@ -5410,7 +5450,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_ALREADY_HAVE_CHARM; } - if (Unit* target = m_targets.getUnitTarget()) + if (Unit* target = m_targets.GetUnitTarget()) { if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsVehicle()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; @@ -5448,11 +5488,11 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS: { - if (!m_targets.getUnitTarget()) + if (!m_targets.GetUnitTarget()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; // can be casted at non-friendly unit or own pet/charm - if (m_caster->IsFriendlyTo(m_targets.getUnitTarget())) + if (m_caster->IsFriendlyTo(m_targets.GetUnitTarget())) return SPELL_FAILED_TARGET_FRIENDLY; break; @@ -5472,13 +5512,13 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_AURA_PERIODIC_MANA_LEECH: { - if (!m_targets.getUnitTarget()) + if (!m_targets.GetUnitTarget()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; if (m_caster->GetTypeId() != TYPEID_PLAYER || m_CastItem) break; - if (m_targets.getUnitTarget()->getPowerType() != POWER_MANA) + if (m_targets.GetUnitTarget()->getPowerType() != POWER_MANA) return SPELL_FAILED_BAD_TARGETS; break; @@ -5489,7 +5529,7 @@ SpellCastResult Spell::CheckCast(bool strict) } // check trade slot case (last, for allow catch any another cast problems) - if (m_targets.getTargetMask() & TARGET_FLAG_TRADE_ITEM) + if (m_targets.GetTargetMask() & TARGET_FLAG_TRADE_ITEM) { if (m_CastItem) return SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW; @@ -5502,7 +5542,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (!my_trade) return SPELL_FAILED_NOT_TRADING; - TradeSlots slot = TradeSlots(m_targets.getItemTargetGUID()); + TradeSlots slot = TradeSlots(m_targets.GetItemTargetGUID()); if (slot != TRADE_SLOT_NONTRADED) return SPELL_FAILED_BAD_TARGETS; @@ -5536,8 +5576,8 @@ SpellCastResult Spell::CheckPetCast(Unit* target) if (!owner->isAlive()) return SPELL_FAILED_CASTER_DEAD; - if (!target && m_targets.getUnitTarget()) - target = m_targets.getUnitTarget(); + if (!target && m_targets.GetUnitTarget()) + target = m_targets.GetUnitTarget(); for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { @@ -5546,12 +5586,12 @@ SpellCastResult Spell::CheckPetCast(Unit* target) { if (!target) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; - m_targets.setUnitTarget(target); + m_targets.SetUnitTarget(target); break; } } - Unit* _target = m_targets.getUnitTarget(); + Unit* _target = m_targets.GetUnitTarget(); if (_target) //for target dead/target not valid { @@ -5726,7 +5766,7 @@ SpellCastResult Spell::CheckRange(bool strict) SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex); - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); float max_range = (float)m_caster->GetSpellMaxRangeForTarget(target, srange); float min_range = (float)m_caster->GetSpellMinRangeForTarget(target, srange); uint32 range_type = GetSpellRangeType(srange); @@ -5760,9 +5800,9 @@ SpellCastResult Spell::CheckRange(bool strict) if (m_targets.HasDst() && !m_targets.HasTraj()) { - if (!m_caster->IsWithinDist3d(&m_targets.m_dstPos, max_range)) + if (!m_caster->IsWithinDist3d(m_targets.GetDst(), max_range)) return SPELL_FAILED_OUT_OF_RANGE; - if (min_range && m_caster->IsWithinDist3d(&m_targets.m_dstPos, min_range)) + if (min_range && m_caster->IsWithinDist3d(m_targets.GetDst(), min_range)) return SPELL_FAILED_TOO_CLOSE; } @@ -5833,19 +5873,19 @@ SpellCastResult Spell::CheckItems() return SPELL_FAILED_NO_CHARGES_REMAIN; // consumable cast item checks - if (proto->Class == ITEM_CLASS_CONSUMABLE && m_targets.getUnitTarget()) + if (proto->Class == ITEM_CLASS_CONSUMABLE && m_targets.GetUnitTarget()) { // such items should only fail if there is no suitable effect at all - see Rejuvenation Potions for example SpellCastResult failReason = SPELL_CAST_OK; for (int i = 0; i < MAX_SPELL_EFFECTS; i++) { - // skip check, pet not required like checks, and for TARGET_UNIT_PET m_targets.getUnitTarget() is not the real target but the caster + // skip check, pet not required like checks, and for TARGET_UNIT_PET m_targets.GetUnitTarget() is not the real target but the caster if (m_spellInfo->EffectImplicitTargetA[i] == TARGET_UNIT_PET) continue; if (m_spellInfo->Effect[i] == SPELL_EFFECT_HEAL) { - if (m_targets.getUnitTarget()->IsFullHealth()) + if (m_targets.GetUnitTarget()->IsFullHealth()) { failReason = SPELL_FAILED_ALREADY_AT_FULL_HEALTH; continue; @@ -5867,7 +5907,7 @@ SpellCastResult Spell::CheckItems() } Powers power = Powers(m_spellInfo->EffectMiscValue[i]); - if (m_targets.getUnitTarget()->GetPower(power) == m_targets.getUnitTarget()->GetMaxPower(power)) + if (m_targets.GetUnitTarget()->GetPower(power) == m_targets.GetUnitTarget()->GetMaxPower(power)) { failReason = SPELL_FAILED_ALREADY_AT_FULL_POWER; continue; @@ -5885,15 +5925,15 @@ SpellCastResult Spell::CheckItems() } // check target item - if (m_targets.getItemTargetGUID()) + if (m_targets.GetItemTargetGUID()) { if (m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_BAD_TARGETS; - if (!m_targets.getItemTarget()) + if (!m_targets.GetItemTarget()) return SPELL_FAILED_ITEM_GONE; - if (!m_targets.getItemTarget()->IsFitToSpellRequirements(m_spellInfo)) + if (!m_targets.GetItemTarget()->IsFitToSpellRequirements(m_spellInfo)) return SPELL_FAILED_EQUIPPED_ITEM_CLASS; } // if not item target then required item must be equipped @@ -5930,7 +5970,7 @@ SpellCastResult Spell::CheckItems() bool checkReagents = !m_IsTriggeredSpell && !p_caster->CanNoReagentCast(m_spellInfo); // Not own traded item (in trader trade slot) requires reagents even if triggered spell if (!checkReagents) - if (Item* targetItem = m_targets.getItemTarget()) + if (Item* targetItem = m_targets.GetItemTarget()) if (targetItem->GetOwnerGUID() != m_caster->GetGUID()) checkReagents = true; @@ -6039,11 +6079,11 @@ SpellCastResult Spell::CheckItems() break; } case SPELL_EFFECT_ENCHANT_ITEM: - if (m_spellInfo->EffectItemType[i] && m_targets.getItemTarget() - && (m_targets.getItemTarget()->IsWeaponVellum() || m_targets.getItemTarget()->IsArmorVellum())) + if (m_spellInfo->EffectItemType[i] && m_targets.GetItemTarget() + && (m_targets.GetItemTarget()->IsWeaponVellum() || m_targets.GetItemTarget()->IsArmorVellum())) { // cannot enchant vellum for other player - if (m_targets.getItemTarget()->GetOwner() != m_caster) + if (m_targets.GetItemTarget()->GetOwner() != m_caster) return SPELL_FAILED_NOT_TRADEABLE; // do not allow to enchant vellum from scroll made by vellum-prevent exploit if (m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST) @@ -6058,7 +6098,7 @@ SpellCastResult Spell::CheckItems() } case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC: { - Item* targetItem = m_targets.getItemTarget(); + Item* targetItem = m_targets.GetItemTarget(); if (!targetItem) return SPELL_FAILED_ITEM_NOT_FOUND; @@ -6097,7 +6137,7 @@ SpellCastResult Spell::CheckItems() } case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY: { - Item *item = m_targets.getItemTarget(); + Item *item = m_targets.GetItemTarget(); if (!item) return SPELL_FAILED_ITEM_NOT_FOUND; // Not allow enchant in trade slot for some enchant type @@ -6117,14 +6157,14 @@ SpellCastResult Spell::CheckItems() break; case SPELL_EFFECT_DISENCHANT: { - if (!m_targets.getItemTarget()) + if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_DISENCHANTED; // prevent disenchanting in trade slot - if (m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) + if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) return SPELL_FAILED_CANT_BE_DISENCHANTED; - ItemTemplate const* itemProto = m_targets.getItemTarget()->GetTemplate(); + ItemTemplate const* itemProto = m_targets.GetItemTarget()->GetTemplate(); if (!itemProto) return SPELL_FAILED_CANT_BE_DISENCHANTED; @@ -6145,46 +6185,46 @@ SpellCastResult Spell::CheckItems() } case SPELL_EFFECT_PROSPECTING: { - if (!m_targets.getItemTarget()) + if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_PROSPECTED; //ensure item is a prospectable ore - if (!(m_targets.getItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_PROSPECTABLE)) + if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_PROSPECTABLE)) return SPELL_FAILED_CANT_BE_PROSPECTED; //prevent prospecting in trade slot - if (m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) + if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) return SPELL_FAILED_CANT_BE_PROSPECTED; //Check for enough skill in jewelcrafting - uint32 item_prospectingskilllevel = m_targets.getItemTarget()->GetTemplate()->RequiredSkillRank; + uint32 item_prospectingskilllevel = m_targets.GetItemTarget()->GetTemplate()->RequiredSkillRank; if (item_prospectingskilllevel >p_caster->GetSkillValue(SKILL_JEWELCRAFTING)) return SPELL_FAILED_LOW_CASTLEVEL; //make sure the player has the required ores in inventory - if (m_targets.getItemTarget()->GetCount() < 5) + if (m_targets.GetItemTarget()->GetCount() < 5) return SPELL_FAILED_NEED_MORE_ITEMS; - if (!LootTemplates_Prospecting.HaveLootFor(m_targets.getItemTargetEntry())) + if (!LootTemplates_Prospecting.HaveLootFor(m_targets.GetItemTargetEntry())) return SPELL_FAILED_CANT_BE_PROSPECTED; break; } case SPELL_EFFECT_MILLING: { - if (!m_targets.getItemTarget()) + if (!m_targets.GetItemTarget()) return SPELL_FAILED_CANT_BE_MILLED; //ensure item is a millable herb - if (!(m_targets.getItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_MILLABLE)) + if (!(m_targets.GetItemTarget()->GetTemplate()->Flags & ITEM_PROTO_FLAG_MILLABLE)) return SPELL_FAILED_CANT_BE_MILLED; //prevent milling in trade slot - if (m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) + if (m_targets.GetItemTarget()->GetOwnerGUID() != m_caster->GetGUID()) return SPELL_FAILED_CANT_BE_MILLED; //Check for enough skill in inscription - uint32 item_millingskilllevel = m_targets.getItemTarget()->GetTemplate()->RequiredSkillRank; + uint32 item_millingskilllevel = m_targets.GetItemTarget()->GetTemplate()->RequiredSkillRank; if (item_millingskilllevel >p_caster->GetSkillValue(SKILL_INSCRIPTION)) return SPELL_FAILED_LOW_CASTLEVEL; //make sure the player has the required herbs in inventory - if (m_targets.getItemTarget()->GetCount() < 5) + if (m_targets.GetItemTarget()->GetCount() < 5) return SPELL_FAILED_NEED_MORE_ITEMS; - if (!LootTemplates_Milling.HaveLootFor(m_targets.getItemTargetEntry())) + if (!LootTemplates_Milling.HaveLootFor(m_targets.GetItemTargetEntry())) return SPELL_FAILED_CANT_BE_MILLED; break; @@ -6534,10 +6574,10 @@ bool Spell::CheckTarget(Unit* target, uint32 eff) // player far away, maybe his corpse near? if (target != m_caster && !target->IsWithinLOSInMap(m_caster)) { - if (!m_targets.getCorpseTargetGUID()) + if (!m_targets.GetCorpseTargetGUID()) return false; - Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.getCorpseTargetGUID()); + Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID()); if (!corpse) return false; @@ -6991,7 +7031,7 @@ void Spell::SelectTrajTargets() if (!dist2d) return; - float dz = m_targets.m_dstPos.m_positionZ - m_targets.m_srcPos.m_positionZ; + float dz = m_targets.GetDst()->m_positionZ - m_targets.GetSrc()->m_positionZ; UnitList unitList; SearchAreaTarget(unitList, dist2d, PUSH_IN_THIN_LINE, SPELL_TARGETS_ANY); @@ -7000,7 +7040,7 @@ void Spell::SelectTrajTargets() unitList.sort(Trinity::ObjectDistanceOrderPred(m_caster)); - float b = tangent(m_targets.m_elevation); + float b = tangent(m_targets.GetElevation()); float a = (dz - dist2d * b) / (dist2d * dist2d); if (a > -0.0001f) a = 0; DEBUG_TRAJ(sLog->outError("Spell::SelectTrajTargets: a %f b %f", a, b);) @@ -7015,8 +7055,8 @@ void Spell::SelectTrajTargets() const float size = std::max((*itr)->GetObjectSize() * 0.7f, 1.0f); // 1/sqrt(3) // TODO: all calculation should be based on src instead of m_caster - const float objDist2d = m_targets.m_srcPos.GetExactDist2d(*itr) * cos(m_targets.m_srcPos.GetRelativeAngle(*itr)); - const float dz = (*itr)->GetPositionZ() - m_targets.m_srcPos.m_positionZ; + const float objDist2d = m_targets.GetSrc()->GetExactDist2d(*itr) * cos(m_targets.GetSrc()->GetRelativeAngle(*itr)); + const float dz = (*itr)->GetPositionZ() - m_targets.GetSrc()->m_positionZ; DEBUG_TRAJ(sLog->outError("Spell::SelectTrajTargets: check %u, dist between %f %f, height between %f %f.", (*itr)->GetEntry(), objDist2d - size, objDist2d + size, dz - size, dz + size);) @@ -7076,11 +7116,11 @@ void Spell::SelectTrajTargets() } } - if (m_targets.m_srcPos.GetExactDist2d(&m_targets.m_dstPos) > bestDist) + if (m_targets.GetSrc()->GetExactDist2d(m_targets.GetDst()) > bestDist) { - float x = m_targets.m_srcPos.m_positionX + cos(m_caster->GetOrientation()) * bestDist; - float y = m_targets.m_srcPos.m_positionY + sin(m_caster->GetOrientation()) * bestDist; - float z = m_targets.m_srcPos.m_positionZ + bestDist * (a * bestDist + b); + float x = m_targets.GetSrc()->m_positionX + cos(m_caster->GetOrientation()) * bestDist; + float y = m_targets.GetSrc()->m_positionY + sin(m_caster->GetOrientation()) * bestDist; + float z = m_targets.GetSrc()->m_positionZ + bestDist * (a * bestDist + b); if (itr != unitList.end()) { @@ -7102,7 +7142,7 @@ void Spell::SelectTrajTargets() Position trajDst; trajDst.Relocate(x, y, z, m_caster->GetOrientation()); - m_targets.modDst(trajDst); + m_targets.ModDst(trajDst); } } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 8b40ffe575a..ddb700aa8ab 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -34,6 +34,8 @@ class ByteBuffer; struct SpellEntry; +#define SPELL_CHANNEL_UPDATE_INTERVAL (1 * IN_MILLISECONDS) + enum SpellCastTargetFlags { TARGET_FLAG_SELF = 0x00000000, @@ -117,117 +119,75 @@ enum SpellNotifyPushType PUSH_CHAIN, }; -bool IsQuestTameSpell(uint32 spellId); - -namespace Trinity -{ - struct SpellNotifierCreatureAndPlayer; -} - -typedef std::list<Unit*> UnitList; - class SpellCastTargets { public: SpellCastTargets(); ~SpellCastTargets(); - SpellCastTargets& operator=(const SpellCastTargets &target) - { - m_unitTarget = target.m_unitTarget; - m_itemTarget = target.m_itemTarget; - m_GOTarget = target.m_GOTarget; + SpellCastTargets& operator=(const SpellCastTargets &target); - m_unitTargetGUID = target.m_unitTargetGUID; - m_GOTargetGUID = target.m_GOTargetGUID; - m_CorpseTargetGUID = target.m_CorpseTargetGUID; - m_itemTargetGUID = target.m_itemTargetGUID; + void Read(ByteBuffer& data, Unit* caster); + void Write(ByteBuffer& data); - m_itemTargetEntry = target.m_itemTargetEntry; + uint32 GetTargetMask() const { return m_targetMask; } + void SetTargetMask(uint32 newMask) { m_targetMask = newMask; } - m_srcTransGUID = target.m_srcTransGUID; - m_srcTransOffset = target.m_srcTransOffset; - m_srcPos = target.m_srcPos; + uint64 GetUnitTargetGUID() const { return m_unitTargetGUID; } + Unit* GetUnitTarget() const { return m_unitTarget; } + void SetUnitTarget(Unit* target); - m_dstTransGUID = target.m_dstTransGUID; - m_dstTransOffset = target.m_dstTransOffset; - m_dstPos = target.m_dstPos; + Position const* GetSrc() const; + void SetSrc(float x, float y, float z); + void SetSrc(Position const& pos); + void SetSrc(WorldObject const& wObj); + void ModSrc(Position const& pos); - m_elevation = target.m_elevation; - m_speed = target.m_speed; + WorldLocation const* GetDst() const; + void SetDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID); + void SetDst(Position const& pos); + void SetDst(WorldObject const& wObj); + void SetDst(SpellCastTargets const& spellTargets); + void ModDst(Position const& pos); - m_strTarget = target.m_strTarget; + uint64 GetGOTargetGUID() const { return m_GOTargetGUID; } + GameObject* GetGOTarget() const { return m_GOTarget; } + void SetGOTarget(GameObject* target); - m_targetMask = target.m_targetMask; + uint64 GetCorpseTargetGUID() const { return m_CorpseTargetGUID; } + void SetCorpseTarget(Corpse* corpse); - return *this; - } - void read (ByteBuffer & data, Unit* caster); - void write (ByteBuffer & data); - - uint32 getTargetMask() const { return m_targetMask; } - void setTargetMask(uint32 newMask) { m_targetMask = newMask; } - - uint64 getUnitTargetGUID() const { return m_unitTargetGUID; } - Unit *getUnitTarget() const { return m_unitTarget; } - void setUnitTarget(Unit* target); - void setSrc(float x, float y, float z); - void setSrc(Position &pos); - void setSrc(WorldObject &wObj); - void modSrc(Position &pos); - void setDst(float x, float y, float z, float orientation, uint32 mapId = MAPID_INVALID); - void setDst(Position &pos); - void setDst(WorldObject &wObj); - void setDst(SpellCastTargets &spellTargets); - void modDst(Position &pos); - - uint64 getGOTargetGUID() const { return m_GOTargetGUID; } - GameObject *getGOTarget() const { return m_GOTarget; } - void setGOTarget(GameObject *target); - - uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID; } - void setCorpseTarget(Corpse* corpse); - uint64 getItemTargetGUID() const { return m_itemTargetGUID; } - Item* getItemTarget() const { return m_itemTarget; } - uint32 getItemTargetEntry() const { return m_itemTargetEntry; } - void setItemTarget(Item* item); - void setTradeItemTarget(Player* caster); - void updateTradeSlotItem() - { - if (m_itemTarget && (m_targetMask & TARGET_FLAG_TRADE_ITEM)) - { - m_itemTargetGUID = m_itemTarget->GetGUID(); - m_itemTargetEntry = m_itemTarget->GetEntry(); - } - } + uint64 GetItemTargetGUID() const { return m_itemTargetGUID; } + Item* GetItemTarget() const { return m_itemTarget; } + uint32 GetItemTargetEntry() const { return m_itemTargetEntry; } + void SetItemTarget(Item* item); + void SetTradeItemTarget(Player* caster); + void UpdateTradeSlotItem(); bool IsEmpty() const { return m_GOTargetGUID == 0 && m_unitTargetGUID == 0 && m_itemTarget == 0 && m_CorpseTargetGUID == 0; } - bool HasSrc() const { return getTargetMask() & TARGET_FLAG_SOURCE_LOCATION; } - bool HasDst() const { return getTargetMask() & TARGET_FLAG_DEST_LOCATION; } + bool HasSrc() const { return GetTargetMask() & TARGET_FLAG_SOURCE_LOCATION; } + bool HasDst() const { return GetTargetMask() & TARGET_FLAG_DEST_LOCATION; } bool HasTraj() const { return m_speed != 0; } + float GetElevation() const { return m_elevation; } + void SetElevation(float elevation) { m_elevation = elevation; } + float GetSpeed() const { return m_speed; } + void SetSpeed(float speed) { m_speed = speed; } + float GetDist2d() const { return m_srcPos.GetExactDist2d(&m_dstPos); } float GetSpeedXY() const { return m_speed * cos(m_elevation); } float GetSpeedZ() const { return m_speed * sin(m_elevation); } void Update(Unit* caster); - void OutDebug(); - - uint64 m_srcTransGUID; - Position m_srcTransOffset; - Position m_srcPos; - uint64 m_dstTransGUID; - Position m_dstTransOffset; - WorldLocation m_dstPos; - float m_elevation, m_speed; - std::string m_strTarget; + void OutDebug() const; private: uint32 m_targetMask; + // objects (can be used at spell creating and after Update at casting - Unit *m_unitTarget; - GameObject *m_GOTarget; - Item *m_itemTarget; + Unit* m_unitTarget; + GameObject* m_GOTarget; + Item* m_itemTarget; // object GUID/etc, can be used always uint64 m_unitTargetGUID; @@ -235,6 +195,17 @@ class SpellCastTargets uint64 m_CorpseTargetGUID; uint64 m_itemTargetGUID; uint32 m_itemTargetEntry; + + uint64 m_srcTransGUID; + Position m_srcTransOffset; + Position m_srcPos; + + uint64 m_dstTransGUID; + Position m_dstTransOffset; + WorldLocation m_dstPos; + + float m_elevation, m_speed; + std::string m_strTarget; }; struct SpellValue @@ -247,7 +218,7 @@ struct SpellValue RadiusMod = 1.0f; AuraStackAmount = 1; } - int32 EffectBasePoints[3]; + int32 EffectBasePoints[MAX_SPELL_EFFECTS]; uint32 MaxAffectedTargets; float RadiusMod; uint8 AuraStackAmount; @@ -263,14 +234,6 @@ enum SpellState SPELL_STATE_DELAYED = 5 }; -enum ReplenishType -{ - REPLENISH_UNDEFINED = 0, - REPLENISH_HEALTH = 20, - REPLENISH_MANA = 21, - REPLENISH_RAGE = 22 -}; - enum SpellTargets { SPELL_TARGETS_NONE = 0, @@ -282,6 +245,11 @@ enum SpellTargets SPELL_TARGETS_GO }; +namespace Trinity +{ + struct SpellNotifierCreatureAndPlayer; +} + class Spell { friend struct Trinity::SpellNotifierCreatureAndPlayer; @@ -416,7 +384,7 @@ class Spell void EffectCastButtons(SpellEffIndex effIndex); void EffectRechargeManaGem(SpellEffIndex effIndex); - typedef std::set<Aura *> UsedSpellMods; + typedef std::set<Aura*> UsedSpellMods; Spell(Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID = 0, bool skipCheck = false); ~Spell(); @@ -469,8 +437,8 @@ class Spell bool CheckTarget(Unit* target, uint32 eff); bool CanAutoCast(Unit* target); - void CheckSrc() { if (!m_targets.HasSrc()) m_targets.setSrc(*m_caster); } - void CheckDst() { if (!m_targets.HasDst()) m_targets.setDst(*m_caster); } + void CheckSrc() { if (!m_targets.HasSrc()) m_targets.SetSrc(*m_caster); } + void CheckDst() { if (!m_targets.HasDst()) m_targets.SetDst(*m_caster); } static void SendCastResult(Player* caster, SpellEntry const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE); void SendCastResult(SpellCastResult result); @@ -565,7 +533,7 @@ class Spell //Spell data SpellSchoolMask m_spellSchoolMask; // Spell school (can be overwrite for some spells (wand shoot for example) WeaponAttackType m_attackType; // For weapon based attack - int32 m_powerCost; // Calculated spell cost initialized only in Spell::prepare + int32 m_powerCost; // Calculated spell cost initialized only in Spell::prepare int32 m_casttime; // Calculated spell cast time initialized only in Spell::prepare bool m_canReflect; // can reflect this spell? bool m_autoRepeat; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 67771d90f1c..6d2a47bdce4 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1162,7 +1162,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) if (Unit* device = seat->GetPassenger(2)) if (!device->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) { - float dist = (*itr)->GetExactDistSq(&m_targets.m_dstPos); + float dist = (*itr)->GetExactDistSq(m_targets.GetDst()); if (dist < minDist) { minDist = dist; @@ -1170,13 +1170,13 @@ void Spell::EffectDummy(SpellEffIndex effIndex) } } } - if (target && target->IsWithinDist2d(&m_targets.m_dstPos, GetSpellRadius(m_spellInfo, effIndex, false) * 2)) // now we use *2 because the location of the seat is not correct + if (target && target->IsWithinDist2d(m_targets.GetDst(), GetSpellRadius(m_spellInfo, effIndex, false) * 2)) // now we use *2 because the location of the seat is not correct passenger->EnterVehicle(target, 0); else { passenger->ExitVehicle(); float x, y, z; - m_targets.m_dstPos.GetPosition(x, y, z); + m_targets.GetDst()->GetPosition(x, y, z); passenger->GetMotionMaster()->MoveJump(x, y, z, m_targets.GetSpeedXY(), m_targets.GetSpeedZ()); } } @@ -1499,10 +1499,10 @@ void Spell::EffectDummy(SpellEffIndex effIndex) bp = 46585; if (m_targets.HasDst()) - targets.setDst(m_targets.m_dstPos); + targets.SetDst(*m_targets.GetDst()); else { - targets.setDst(*m_caster); + targets.SetDst(*m_caster); // Corpse not found - take reagents (only not triggered cast can take them) triggered = false; } @@ -1513,7 +1513,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) // Raise dead - take reagents and trigger summon spells case 48289: if (m_targets.HasDst()) - targets.setDst(m_targets.m_dstPos); + targets.SetDst(*m_targets.GetDst()); spell_id = CalculateDamage(0, NULL); break; @@ -1532,7 +1532,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) return; } - targets.setUnitTarget(unitTarget); + targets.SetUnitTarget(unitTarget); Spell* spell = new Spell(m_caster, spellInfo, triggered, m_originalCasterGUID, true); if (bp) spell->SetSpellValue(SPELLVALUE_BASE_POINT0, bp); spell->prepare(&targets); @@ -1834,7 +1834,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); float x, y, z; - m_targets.m_dstPos.GetPosition(x, y, z); + m_targets.GetDst()->GetPosition(x, y, z); m_caster->CastSpell(x, y, z, spellInfo->Id, true, m_CastItem, 0, m_originalCasterGUID); } @@ -1844,10 +1844,10 @@ void Spell::EffectJump(SpellEffIndex effIndex) return; float x, y, z; - if (m_targets.getUnitTarget()) - m_targets.getUnitTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); - else if (m_targets.getGOTarget()) - m_targets.getGOTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); + if (m_targets.GetUnitTarget()) + m_targets.GetUnitTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); + else if (m_targets.GetGOTarget()) + m_targets.GetGOTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); else { sLog->outError("Spell::EffectJump - unsupported target mode for spell ID %u", m_spellInfo->Id); @@ -1868,15 +1868,15 @@ void Spell::EffectJumpDest(SpellEffIndex effIndex) float x, y, z; if (m_targets.HasDst()) { - m_targets.m_dstPos.GetPosition(x, y, z); + m_targets.GetDst()->GetPosition(x, y, z); if (m_spellInfo->EffectImplicitTargetA[effIndex] == TARGET_DEST_TARGET_BACK) { // explicit cast data from client or server-side cast // some spell at client send caster Unit* pTarget = NULL; - if (m_targets.getUnitTarget() && m_targets.getUnitTarget() != m_caster) - pTarget = m_targets.getUnitTarget(); + if (m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster) + pTarget = m_targets.GetUnitTarget(); else if (m_caster->getVictim()) pTarget = m_caster->getVictim(); else if (m_caster->GetTypeId() == TYPEID_PLAYER) @@ -1934,18 +1934,18 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) if (Player* pTarget = unitTarget->ToPlayer()) { if (pTarget->GetTeamId() == TEAM_ALLIANCE) - m_targets.setDst(442.24f, -835.25f, 44.30f, 0.06f, 628); + m_targets.SetDst(442.24f, -835.25f, 44.30f, 0.06f, 628); else - m_targets.setDst(1120.43f, -762.11f, 47.92f, 2.94f, 628); + m_targets.SetDst(1120.43f, -762.11f, 47.92f, 2.94f, 628); } break; case 66551: // teleports inside (Isle of Conquest) if (Player* pTarget = unitTarget->ToPlayer()) { if (pTarget->GetTeamId() == TEAM_ALLIANCE) - m_targets.setDst(389.57f, -832.38f, 48.65f, 3.00f, 628); + m_targets.SetDst(389.57f, -832.38f, 48.65f, 3.00f, 628); else - m_targets.setDst(1174.85f, -763.24f, 48.72f, 6.26f, 628); + m_targets.SetDst(1174.85f, -763.24f, 48.72f, 6.26f, 628); } break; } @@ -1958,13 +1958,13 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) } // Init dest coordinates - uint32 mapid = m_targets.m_dstPos.GetMapId(); + uint32 mapid = m_targets.GetDst()->GetMapId(); if (mapid == MAPID_INVALID) mapid = unitTarget->GetMapId(); float x, y, z, orientation; - m_targets.m_dstPos.GetPosition(x, y, z, orientation); - if (!orientation && m_targets.getUnitTarget()) - orientation = m_targets.getUnitTarget()->GetOrientation(); + m_targets.GetDst()->GetPosition(x, y, z, orientation); + if (!orientation && m_targets.GetUnitTarget()) + orientation = m_targets.GetUnitTarget()->GetOrientation(); sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - teleport unit to %u %f %f %f %f\n", mapid, x, y, z, orientation); if (mapid == unitTarget->GetMapId()) @@ -2535,7 +2535,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) if (!caster->IsInWorld()) return; DynamicObject* dynObj = new DynamicObject(); - if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, m_targets.m_dstPos, radius, false, DYNAMIC_OBJECT_AREA_SPELL)) + if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, false, DYNAMIC_OBJECT_AREA_SPELL)) { delete dynObj; return; @@ -2896,8 +2896,8 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true); // prevent crash at access and unexpected charges counting with item update queue corrupt - if (m_CastItem == m_targets.getItemTarget()) - m_targets.setItemTarget(NULL); + if (m_CastItem == m_targets.GetItemTarget()) + m_targets.SetItemTarget(NULL); m_CastItem = NULL; @@ -2914,8 +2914,8 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) player->DestroyItem(m_CastItem->GetBagSlot(), m_CastItem->GetSlot(), true); // prevent crash at access and unexpected charges counting with item update queue corrupt - if (m_CastItem == m_targets.getItemTarget()) - m_targets.setItemTarget(NULL); + if (m_CastItem == m_targets.GetItemTarget()) + m_targets.SetItemTarget(NULL); m_CastItem = NULL; @@ -2936,8 +2936,8 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) if (msg == EQUIP_ERR_CANT_DO_RIGHT_NOW) dest = EQUIPMENT_SLOT_MAINHAND; // prevent crash at access and unexpected charges counting with item update queue corrupt - if (m_CastItem == m_targets.getItemTarget()) - m_targets.setItemTarget(NULL); + if (m_CastItem == m_targets.GetItemTarget()) + m_targets.SetItemTarget(NULL); m_CastItem = NULL; @@ -3305,7 +3305,7 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) if (unitTarget->HasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_STUNNED | UNIT_STAT_FLEEING)) return; - float angle = unitTarget->GetAngle(&m_targets.m_dstPos); + float angle = unitTarget->GetAngle(m_targets.GetDst()); if (unitTarget->GetTypeId() == TYPEID_PLAYER) { @@ -3348,7 +3348,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) return; DynamicObject* dynObj = new DynamicObject(); - if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, m_targets.m_dstPos, radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) + if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj; return; @@ -3455,7 +3455,7 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) // and add a scroll DoCreateItem(effIndex, m_spellInfo->EffectItemType[effIndex]); itemTarget=NULL; - m_targets.setItemTarget(NULL); + m_targets.SetItemTarget(NULL); } else { @@ -3608,7 +3608,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) { Spell* spell = new Spell(m_caster, spellInfo, true); SpellCastTargets targets; - targets.setItemTarget(item); + targets.SetItemTarget(item); spell->prepare(&targets); } } @@ -4248,7 +4248,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) float x, y, z; if (m_targets.HasDst()) - m_targets.m_dstPos.GetPosition(x, y, z); + m_targets.GetDst()->GetPosition(x, y, z); else m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); @@ -4759,7 +4759,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) float radius = GetSpellRadius(m_spellInfo, effIndex, true); for (uint8 i = 0; i < 15; ++i) { - m_caster->GetRandomPoint(m_targets.m_dstPos, radius, x, y, z); + m_caster->GetRandomPoint(*m_targets.GetDst(), radius, x, y, z); m_caster->CastSpell(x, y, z, 54522, true); } break; @@ -5309,15 +5309,15 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) if (m_spellInfo->SpellFamilyFlags[1]&0x10000) { // Get diseases on target of spell - if (m_targets.getUnitTarget() && // Glyph of Disease - cast on unit target too to refresh aura - (m_targets.getUnitTarget() != unitTarget || m_caster->GetAura(63334))) + if (m_targets.GetUnitTarget() && // Glyph of Disease - cast on unit target too to refresh aura + (m_targets.GetUnitTarget() != unitTarget || m_caster->GetAura(63334))) { // And spread them on target // Blood Plague - if (m_targets.getUnitTarget()->GetAura(55078)) + if (m_targets.GetUnitTarget()->GetAura(55078)) m_caster->CastSpell(unitTarget, 55078, true); // Frost Fever - if (m_targets.getUnitTarget()->GetAura(55095)) + if (m_targets.GetUnitTarget()->GetAura(55095)) m_caster->CastSpell(unitTarget, 55095, true); } } @@ -5674,7 +5674,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex) Player* _player = m_caster->ToPlayer(); - Item* foodItem = m_targets.getItemTarget(); + Item* foodItem = m_targets.GetItemTarget(); if (!foodItem) return; @@ -5749,7 +5749,7 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) float x, y, z; // If dest location if present if (m_targets.HasDst()) - m_targets.m_dstPos.GetPosition(x, y, z); + m_targets.GetDst()->GetPosition(x, y, z); // Summon in random point all other units if location present else m_caster->GetClosePoint(x, y, z, DEFAULT_WORLD_OBJECT_SIZE); @@ -5863,7 +5863,7 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/) if (!m_targets.HasDst()) return; - unitTarget->NearTeleportTo(m_targets.m_dstPos.GetPositionX(), m_targets.m_dstPos.GetPositionY(), m_targets.m_dstPos.GetPositionZ(), m_targets.m_dstPos.GetOrientation(), unitTarget == m_caster); + unitTarget->NearTeleportTo(m_targets.GetDst()->GetPositionX(), m_targets.GetDst()->GetPositionY(), m_targets.GetDst()->GetPositionZ(), m_targets.GetDst()->GetOrientation(), unitTarget == m_caster); } void Spell::EffectReputation(SpellEffIndex effIndex) @@ -5984,7 +5984,7 @@ void Spell::EffectSkinning(SpellEffIndex /*effIndex*/) void Spell::EffectCharge(SpellEffIndex /*effIndex*/) { - Unit* target = m_targets.getUnitTarget(); + Unit* target = m_targets.GetUnitTarget(); if (!target) return; @@ -6002,7 +6002,7 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/) if (m_targets.HasDst()) { float x, y, z; - m_targets.m_dstPos.GetPosition(x, y, z); + m_targets.GetDst()->GetPosition(x, y, z); m_caster->GetMotionMaster()->MoveCharge(x, y, z); } } @@ -6050,7 +6050,7 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex) if (m_spellInfo->Effect[effIndex] == SPELL_EFFECT_KNOCK_BACK_DEST) { if (m_targets.HasDst()) - m_targets.m_dstPos.GetPosition(x, y); + m_targets.GetDst()->GetPosition(x, y); else return; } @@ -6068,8 +6068,8 @@ void Spell::EffectLeapBack(SpellEffIndex effIndex) float speedz = float(damage/10); if (!speedxy) { - if (m_targets.getUnitTarget()) - m_caster->JumpTo(m_targets.getUnitTarget(), speedz); + if (m_targets.GetUnitTarget()) + m_caster->JumpTo(m_targets.GetUnitTarget(), speedz); } else { @@ -6136,7 +6136,7 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) if (m_spellInfo->Effect[effIndex] == SPELL_EFFECT_PULL_TOWARDS_DEST) { if (m_targets.HasDst()) - pos.Relocate(m_targets.m_dstPos); + pos.Relocate(*m_targets.GetDst()); else return; } @@ -6303,7 +6303,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) float fx, fy, fz; if (m_targets.HasDst()) - m_targets.m_dstPos.GetPosition(fx, fy, fz); + m_targets.GetDst()->GetPosition(fx, fy, fz); //FIXME: this can be better check for most objects but still hack else if (m_spellInfo->EffectRadiusIndex[effIndex] && m_spellInfo->speed == 0) { @@ -6893,7 +6893,7 @@ void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 coun { // Summon 1 unit in dest location if (count == 0) - pos.Relocate(m_targets.m_dstPos); + pos.Relocate(*m_targets.GetDst()); // Summon in random point all other units if location present else { @@ -6906,10 +6906,10 @@ void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 coun break; case TARGET_DEST_DEST_RANDOM: case TARGET_DEST_TARGET_RANDOM: - m_caster->GetRandomPoint(m_targets.m_dstPos, radius, pos); + m_caster->GetRandomPoint(*m_targets.GetDst(), radius, pos); break; default: - pos.Relocate(m_targets.m_dstPos); + pos.Relocate(*m_targets.GetDst()); break; } } diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index b5a43868de7..c824d6f2334 100755 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -289,6 +289,11 @@ inline bool IsLootCraftingSpell(SpellEntry const *spellInfo) (spellInfo->TotemCategory[0] != 0 || spellInfo->EffectItemType[0]==0))); } +inline bool IsQuestTameSpell(SpellEntry const* spellInfo) +{ + return spellInfo->Effect[0] == SPELL_EFFECT_THREAT && spellInfo->Effect[1] == SPELL_EFFECT_APPLY_AURA && spellInfo->EffectApplyAuraName[1] == SPELL_AURA_DUMMY; +} + bool IsHigherHankOfSpell(uint32 spellId_1, uint32 spellId_2); bool IsSingleFromSpellSpecificPerCaster(SpellSpecific spellSpec1, SpellSpecific spellSpec2); bool IsSingleFromSpellSpecificPerTarget(SpellSpecific spellSpec1, SpellSpecific spellSpec2); diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index 59be9c71963..0fe75da3da1 100755 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -266,26 +266,31 @@ SpellEntry const* SpellScript::GetSpellInfo() return m_spell->GetSpellInfo(); } -WorldLocation* SpellScript::GetTargetDest() +WorldLocation const* SpellScript::GetTargetDest() { if (m_spell->m_targets.HasDst()) - return &m_spell->m_targets.m_dstPos; + return m_spell->m_targets.GetDst(); return NULL; } +void SpellScript::SetTargetDest(WorldLocation& loc) +{ + m_spell->m_targets.SetDst(loc); +} + Unit* SpellScript::GetTargetUnit() { - return m_spell->m_targets.getUnitTarget(); + return m_spell->m_targets.GetUnitTarget(); } GameObject* SpellScript::GetTargetGObj() { - return m_spell->m_targets.getGOTarget(); + return m_spell->m_targets.GetGOTarget(); } Item* SpellScript::GetTargetItem() { - return m_spell->m_targets.getItemTarget(); + return m_spell->m_targets.GetItemTarget(); } Unit* SpellScript::GetHitUnit() diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 4b0709b74e3..5c5050aef21 100755 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -261,7 +261,9 @@ class SpellScript : public _SpellScript // accessors to the "focus" targets of the spell // note: do not confuse these with spell hit targets // returns: WorldLocation which was selected as a spell destination or NULL - WorldLocation* GetTargetDest(); + WorldLocation const* GetTargetDest(); + + void SetTargetDest(WorldLocation& loc); // returns: Unit which was selected as a spell target or NULL Unit* GetTargetUnit(); diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp index 9e8890b7064..896d27bd768 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp @@ -47,8 +47,7 @@ public: } if (pInstance->GetData(EVENT_STATE)!= CANNON_NOT_USED) return false; - if (targets.getGOTarget() && targets.getGOTarget()->GetTypeId() == TYPEID_GAMEOBJECT && - targets.getGOTarget()->GetEntry() == GO_DEFIAS_CANNON) + if (targets.GetGOTarget() && targets.GetGOTarget()->GetEntry() == GO_DEFIAS_CANNON) { pInstance->SetData(EVENT_STATE, CANNON_GUNPOWDER_USED); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 3e66cf5ec8e..4a394cffe62 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -1478,9 +1478,10 @@ class spell_valanar_kinetic_bomb : public SpellScriptLoader void ChangeSummonPos(SpellEffIndex /*effIndex*/) { - WorldLocation* summonPos = GetTargetDest(); + WorldLocation summonPos = *GetTargetDest(); Position offset = {0.0f, 0.0f, 20.0f, 0.0f}; - summonPos->RelocateOffset(offset); // +20 in height + summonPos.RelocateOffset(offset); + SetTargetDest(summonPos); } void Register() diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 2dbca8f4f8f..ffc0b7fb026 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -1260,7 +1260,7 @@ class spell_rimefang_icy_blast : public SpellScriptLoader void HandleTriggerMissile(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - if (Position* pos = GetTargetDest()) + if (Position const* pos = GetTargetDest()) if (TempSummon* summon = GetCaster()->SummonCreature(NPC_ICY_BLAST, *pos, TEMPSUMMON_TIMED_DESPAWN, 40000)) summon->CastSpell(summon, SPELL_ICY_BLAST_AREA, true); } diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp index 789c17b1b1f..73baeae441f 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp @@ -988,7 +988,7 @@ class spell_razorscale_devouring_flame : public SpellScriptLoader PreventHitDefaultEffect(effIndex); Unit* caster = GetCaster(); uint32 entry = uint32(GetSpellInfo()->EffectMiscValue[effIndex]); - WorldLocation* summonLocation = GetTargetDest(); + WorldLocation const* summonLocation = GetTargetDest(); if (!caster || !summonLocation) return; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 45b8b5d3590..93903e4f297 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -988,11 +988,11 @@ public: Vashj = (Unit::GetCreature((*pPlayer), pInstance->GetData64(DATA_LADYVASHJ))); if (Vashj && (CAST_AI(boss_lady_vashj::boss_lady_vashjAI, Vashj->AI())->Phase == 2)) { - if (targets.getGOTarget() && targets.getGOTarget()->GetTypeId() == TYPEID_GAMEOBJECT) + if (GameObject* gObj = targets.GetGOTarget()) { uint32 identifier; uint8 channel_identifier; - switch(targets.getGOTarget()->GetEntry()) + switch(gObj->GetEntry()) { case 185052: identifier = DATA_SHIELDGENERATOR1; @@ -1035,12 +1035,12 @@ public: pPlayer->DestroyItemCount(31088, 1, true); return true; } - else if (targets.getUnitTarget()->GetTypeId() == TYPEID_UNIT) + else if (targets.GetUnitTarget()->GetTypeId() == TYPEID_UNIT) return false; - else if (targets.getUnitTarget()->GetTypeId() == TYPEID_PLAYER) + else if (targets.GetUnitTarget()->GetTypeId() == TYPEID_PLAYER) { pPlayer->DestroyItemCount(31088, 1, true); - pPlayer->CastSpell(targets.getUnitTarget(), 38134, true); + pPlayer->CastSpell(targets.GetUnitTarget(), 38134, true); return true; } } |