diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Miscellaneous/SharedDefines.h | 69 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSocket.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 257 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.h | 26 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 258 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.h | 25 |
9 files changed, 168 insertions, 485 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d9799d81bac..a7d84a4187f 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11578,10 +11578,10 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr) { - SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId); + SpellInfo const* inmmuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId); if ((itr->type & spellInfo->GetSchoolMask()) - && !(immuneSpellInfo && immuneSpellInfo->IsPositive() && spellInfo->IsPositive()) - && !spellInfo->CanPierceImmuneAura(immuneSpellInfo)) + && !(inmmuneSpellInfo->IsPositive() && spellInfo->IsPositive()) + && !spellInfo->CanPierceImmuneAura(inmmuneSpellInfo)) return true; } } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 07e84405128..4b7825488b9 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1287,64 +1287,65 @@ enum Targets TARGET_UNIT_TARGET_ENEMY = 6, TARGET_UNIT_AREA_ENTRY_SRC = 7, TARGET_UNIT_AREA_ENTRY_DST = 8, - TARGET_DEST_HOME = 9, - TARGET_UNIT_TARGET_CASTER_SRC = 11, // teleport target to caster + TARGET_DST_HOME = 9, + TARGET_UNIT_TARGET_DEST_CASTER = 11, // teleport target to caster TARGET_UNIT_AREA_ENEMY_SRC = 15, TARGET_UNIT_AREA_ENEMY_DST = 16, - TARGET_DEST_DB = 17, - TARGET_DEST_CASTER = 18, - TARGET_UNIT_AREA_PARTY = 20, + TARGET_DST_DB = 17, + TARGET_DST_CASTER = 18, + TARGET_UNIT_PARTY_CASTER = 20, TARGET_UNIT_TARGET_ALLY = 21, TARGET_SRC_CASTER = 22, - TARGET_GAMEOBJECT_TARGET = 23, - TARGET_UNIT_CONE_ENEMY_24 = 24, + TARGET_GAMEOBJECT = 23, + TARGET_UNIT_CONE_ENEMY = 24, TARGET_UNIT_TARGET_ANY = 25, - TARGET_GAMEOBJECT_ITEM_TARGET = 26, + TARGET_GAMEOBJECT_ITEM = 26, TARGET_UNIT_MASTER = 27, TARGET_DEST_DYNOBJ_ENEMY = 28, TARGET_DEST_DYNOBJ_ALLY = 29, TARGET_UNIT_AREA_ALLY_SRC = 30, TARGET_UNIT_AREA_ALLY_DST = 31, - TARGET_DEST_CASTER_SUMMON = 32, // front left, 1y from caster + TARGET_MINION = 32, + //TARGET_DEST_SUMMON TARGET_UNIT_AREA_PARTY_SRC = 33, TARGET_UNIT_AREA_PARTY_DST = 34, TARGET_UNIT_TARGET_PARTY = 35, - TARGET_DEST_CASTER_UNKNOWN_36 = 36, // possibly some nearby entry dest - TARGET_UNIT_TARGET_AREA_PARTY = 37, // targets all units in party of selected target + TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown + TARGET_UNIT_TARGET_ALLY_PARTY = 37, TARGET_UNIT_NEARBY_ENTRY = 38, - TARGET_DEST_CASTER_FISHING = 39, + TARGET_UNIT_CASTER_FISHING = 39, TARGET_GAMEOBJECT_NEARBY_ENTRY = 40, - TARGET_DEST_CASTER_FRONT_RIGHT = 41, - TARGET_DEST_CASTER_BACK_RIGHT = 42, - TARGET_DEST_CASTER_BACK_LEFT = 43, - TARGET_DEST_CASTER_FRONT_LEFT = 44, - TARGET_UNIT_TARGET_RAID_OR_PARTY = 45, - TARGET_DEST_NEARBY_ENTRY = 46, + TARGET_DEST_CASTER_FRONT_LEFT = 41, + TARGET_DEST_CASTER_BACK_LEFT = 42, + TARGET_DEST_CASTER_BACK_RIGHT = 43, + TARGET_DEST_CASTER_FRONT_RIGHT = 44, + TARGET_UNIT_CHAINHEAL = 45, + TARGET_DST_NEARBY_ENTRY = 46, TARGET_DEST_CASTER_FRONT = 47, TARGET_DEST_CASTER_BACK = 48, TARGET_DEST_CASTER_RIGHT = 49, TARGET_DEST_CASTER_LEFT = 50, TARGET_GAMEOBJECT_AREA_SRC = 51, TARGET_GAMEOBJECT_AREA_DST = 52, - TARGET_DEST_TARGET_ENEMY = 53, - TARGET_UNIT_CONE_ENEMY_54 = 54, + TARGET_DST_TARGET_ENEMY = 53, // set unit coordinates as dest, only 16 target B imlemented + TARGET_UNIT_CONE_ENEMY_UNKNOWN = 54, // 180 degree, or different angle TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell - TARGET_UNIT_AREA_RAID = 56, + TARGET_UNIT_RAID_CASTER = 56, TARGET_UNIT_TARGET_RAID = 57, TARGET_UNIT_NEARBY_RAID = 58, TARGET_UNIT_CONE_ALLY = 59, TARGET_UNIT_CONE_ENTRY = 60, - TARGET_UNIT_TARGET_RAID_AREA_CLASS = 61, // targets all units in raid which have class of selected target + TARGET_UNIT_TARGET_CLASS_RAID = 61, TARGET_TEST = 62, // for a test spell TARGET_DEST_TARGET_ANY = 63, TARGET_DEST_TARGET_FRONT = 64, TARGET_DEST_TARGET_BACK = 65, TARGET_DEST_TARGET_RIGHT = 66, TARGET_DEST_TARGET_LEFT = 67, - TARGET_DEST_TARGET_FRONT_RIGHT = 68, - TARGET_DEST_TARGET_BACK_RIGHT = 69, - TARGET_DEST_TARGET_BACK_LEFT = 70, - TARGET_DEST_TARGET_FRONT_LEFT = 71, + TARGET_DEST_TARGET_FRONT_LEFT = 68, + TARGET_DEST_TARGET_BACK_LEFT = 69, + TARGET_DEST_TARGET_BACK_RIGHT = 70, + TARGET_DEST_TARGET_FRONT_RIGHT = 71, TARGET_DEST_CASTER_RANDOM = 72, TARGET_DEST_CASTER_RADIUS = 73, TARGET_DEST_TARGET_RANDOM = 74, @@ -1355,10 +1356,10 @@ enum Targets TARGET_DEST_DEST_BACK = 79, TARGET_DEST_DEST_RIGHT = 80, TARGET_DEST_DEST_LEFT = 81, - TARGET_DEST_DEST_FRONT_RIGHT = 82, - TARGET_DEST_DEST_BACK_RIGHT = 83, - TARGET_DEST_DEST_BACK_LEFT = 84, - TARGET_DEST_DEST_FRONT_LEFT = 85, + TARGET_DEST_DEST_FRONT_LEFT = 82, + TARGET_DEST_DEST_BACK_LEFT = 83, + TARGET_DEST_DEST_BACK_RIGHT = 84, + TARGET_DEST_DEST_FRONT_RIGHT = 85, TARGET_DEST_DEST_RANDOM = 86, TARGET_DEST_DEST = 87, TARGET_DEST_DYNOBJ_NONE = 88, @@ -1366,7 +1367,7 @@ enum Targets TARGET_UNIT_TARGET_MINIPET = 90, TARGET_DEST_DEST_RANDOM_DIR_DIST = 91, TARGET_UNIT_SUMMONER = 92, - TARGET_CORPSE_AREA_ENEMY_SRC = 93, // TODO + TARGET_CORPSE_AREA_ENEMY_PLAYER_SRC= 93, // TODO TARGET_UNIT_VEHICLE = 94, TARGET_UNIT_TARGET_PASSENGER = 95, TARGET_UNIT_PASSENGER_0 = 96, @@ -1377,12 +1378,12 @@ enum Targets TARGET_UNIT_PASSENGER_5 = 101, TARGET_UNIT_PASSENGER_6 = 102, TARGET_UNIT_PASSENGER_7 = 103, - TARGET_UNIT_CONE_ENEMY_104 = 104, + TARGET_UNIT_AREA_PATH = 104, TARGET_UNIT_UNK_105 = 105, // 1 spell TARGET_DEST_CHANNEL_CASTER = 106, TARGET_UNK_AREA_UNK_DST_107 = 107, // not enough info - only generic spells avalible - TARGET_GAMEOBJECT_CONE = 108, - TARGET_DEST_UNK_110 = 110, + TARGET_GAMEOBJECT_AREA_PATH = 108, + TARGET_DEST_UNK_110 = 110, // some kind of traj? TOTAL_SPELL_TARGETS }; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index ff2e6caf73d..c63761a3255 100755 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -893,7 +893,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) //! Negative mutetime indicates amount of seconds to be muted effective on next login - which is now. if (mutetime < 0) { - mutetime = time(NULL) + -mutetime; + mutetime = time(NULL) + llabs(mutetime); LoginDatabase.PExecute("UPDATE account SET mutetime = " SI64FMTD " WHERE id = '%u'", mutetime, id); } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 56977aaa894..76fd348018e 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2447,7 +2447,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.GetObjectTargetGUID() == target->GetGUID()) + && (*iter)->GetCurrentSpell(i)->m_targets.GetUnitTargetGUID() == target->GetGUID()) { (*iter)->InterruptSpell(CurrentSpellTypes(i), false); } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index d55aa3cc341..a40ff40d935 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -117,15 +117,21 @@ void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) { data >> m_targetMask; - if (m_targetMask == TARGET_FLAG_NONE) + if (m_targetMask == TARGET_FLAG_SELF) return; - if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_MINIPET | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_CORPSE_ALLY)) - data.readPackGUID(m_objectTargetGUID); + if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_UNIT_MINIPET)) + data.readPackGUID(m_unitTargetGUID); + + if (m_targetMask & (TARGET_FLAG_GAMEOBJECT)) + data.readPackGUID(m_GOTargetGUID); if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) data.readPackGUID(m_itemTargetGUID); + if (m_targetMask & (TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_CORPSE_ALLY)) + data.readPackGUID(m_CorpseTargetGUID); + if (m_targetMask & TARGET_FLAG_SOURCE_LOCATION) { data.readPackGUID(m_srcTransGUID); @@ -171,7 +177,26 @@ void SpellCastTargets::Write(ByteBuffer& data) data << uint32(m_targetMask); if (m_targetMask & (TARGET_FLAG_UNIT | TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_CORPSE_ENEMY | TARGET_FLAG_UNIT_MINIPET)) - data.append(m_objectTargetGUID); + { + if (m_targetMask & TARGET_FLAG_UNIT) + { + if (m_unitTarget) + data.append(m_unitTarget->GetPackGUID()); + else + data << uint8(0); + } + else if (m_targetMask & TARGET_FLAG_GAMEOBJECT) + { + if (m_GOTarget) + data.append(m_GOTarget->GetPackGUID()); + else + data << uint8(0); + } + else if (m_targetMask & (TARGET_FLAG_CORPSE_ALLY | TARGET_FLAG_CORPSE_ENEMY)) + data.appendPackGUID(m_CorpseTargetGUID); + else + data << uint8(0); + } if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) { @@ -213,18 +238,6 @@ void SpellCastTargets::SetUnitTarget(Unit* target) m_targetMask |= TARGET_FLAG_UNIT; } -void SpellCastTargets::SetGOTarget(GameObject* target) -{ - m_GOTarget = target; - m_GOTargetGUID = target->GetGUID(); - m_targetMask |= TARGET_FLAG_GAMEOBJECT; -} - -void SpellCastTargets::SetCorpseTarget(Corpse* corpse) -{ - m_CorpseTargetGUID = corpse->GetGUID(); -} - Position const* SpellCastTargets::GetSrc() const { return &m_srcPos; @@ -317,6 +330,13 @@ void SpellCastTargets::ModDst(Position const& pos) m_dstPos.Relocate(pos); } +void SpellCastTargets::SetGOTarget(GameObject* target) +{ + m_GOTarget = target; + m_GOTargetGUID = target->GetGUID(); + m_targetMask |= TARGET_FLAG_GAMEOBJECT; +} + void SpellCastTargets::SetItemTarget(Item* item) { if (!item) @@ -346,6 +366,11 @@ void SpellCastTargets::UpdateTradeSlotItem() } } +void SpellCastTargets::SetCorpseTarget(Corpse* corpse) +{ + m_CorpseTargetGUID = corpse->GetGUID(); +} + void SpellCastTargets::Update(Unit* caster) { m_GOTarget = m_GOTargetGUID ? caster->GetMap()->GetGameObject(m_GOTargetGUID) : NULL; @@ -607,7 +632,22 @@ void Spell::SelectSpellTargets() continue; } - /*// TODO: fix this motherfucker, nothing should be added to spell targets + if (!targetA && !targetB) + { + if (!m_spellInfo->GetMaxRange(true)) + { + AddUnitTarget(m_caster, i); + continue; + } + + // add here custom effects that need default target. + // FOR EVERY TARGET TYPE THERE IS A DIFFERENT FILL!! + switch(m_spellInfo->Effects[i].Effect) + { + case SPELL_EFFECT_DUMMY: + { + switch(m_spellInfo->Id) + { case 20577: // Cannibalize case 54044: // Carrion Feeder { @@ -643,80 +683,7 @@ void Spell::SelectSpellTargets() finish(false); } break; - }*/ - - if (!targetA && !targetB) - { - if (!m_spellInfo->GetMaxRange(true)) - { - AddUnitTarget(m_caster, i); - continue; - } - - // IF SPELL HAS EFFECT WHICH DOES NOT FIT PURPOSE OF THE EFFECT IT SHOULD BE SELECTED ANYWAYS - // add here custom effects that need default target. - switch(m_spellInfo->Effects[i].Effect) - { - SPELL_EFFECT_INSTAKILL //unit - SPELL_EFFECT_SCHOOL_DAMAGE // unit; on missing: add explicit - SPELL_EFFECT_DUMMY // any, no; on missing: execute - SPELL_EFFECT_TELEPORT_UNITS // unit+dest - SPELL_EFFECT_APPLY_AURA // unit, on missing: explicit, caster - SPELL_EFFECT_ENVIRONMENTAL_DAMAGE //unit - SPELL_EFFECT_POWER_DRAIN //unit, on missing: add explicit - SPELL_EFFECT_HEALTH_LEECH //unit, on missing: add explicit - SPELL_EFFECT_HEAL //unit - SPELL_EFFECT_BIND //unit, on missing: add explicit - SPELL_EFFECT_QUEST_COMPLETE //unit - - - - - - - - // always caster - case SPELL_EFFECT_KILL_CREDIT2: - case SPELL_EFFECT_ENERGIZE: - case SPELL_EFFECT_DISPEL_MECHANIC: - //unk - - case SPELL_EFFECT_LEARN_PET_SPELL: - case SPELL_EFFECT_FEED_PET: - // effects using dest, can have no target - case SPELL_EFFECT_CREATE_HOUSE: - case SPELL_EFFECT_SUMMON_PET: - case SPELL_EFFECT_149: - case SPELL_EFFECT_PERSISTENT_AREA_AURA: - case SPELL_EFFECT_ADD_FARSIGHT: - case SPELL_EFFECT_SUMMON: - case SPELL_EFFECT_TRIGGER_MISSILE: - case SPELL_EFFECT_SUMMON_OBJECT_WILD: - case SPELL_EFFECT_TRANS_DOOR: - - // effects using spell explicit target - case SPELL_EFFECT_HEAL_MAX_HEALTH: - case SPELL_EFFECT_ADD_HONOR: - case SPELL_EFFECT_POWER_DRAIN: - case SPELL_EFFECT_HEALTH_LEECH: - case SPELL_EFFECT_SCHOOL_DAMAGE: - case SPELL_EFFECT_REPUTATION: - case SPELL_EFFECT_SKILL_STEP: - case SPELL_EFFECT_LEARN_SPELL: - case SPELL_EFFECT_BIND: - case SPELL_EFFECT_CREATE_ITEM: - case SPELL_EFFECT_SKIN_PLAYER_CORPSE: - case SPELL_EFFECT_UNLEARN_SPECIALIZATION: - case SPELL_EFFECT_RESURRECT_NEW: - case SPELL_EFFECT_RESURRECT: - case SPELL_EFFECT_APPLY_GLYPH: - case SPELL_EFFECT_DISPEL: - case SPELL_EFFECT_APPLY_AURA: // can have no targets - caster in that case - case SPELL_EFFECT_SUMMON_CHANGE_ITEM: // can have no targets - caster in that case - case SPELL_EFFECT_SEND_TAXI: - { - switch(m_spellInfo->Id) - { + } default: if (m_targets.GetUnitTarget()) AddUnitTarget(m_targets.GetUnitTarget(), i); @@ -726,56 +693,6 @@ void Spell::SelectSpellTargets() } break; } - // effects using item target - case SPELL_EFFECT_ENCHANT_ITEM: - case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY: - case SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC: - case SPELL_EFFECT_DISENCHANT: - case SPELL_EFFECT_PROSPECTING: - case SPELL_EFFECT_MILLING: - // can be unit target or corpse target - // possibly failure at corpse remove? - if (WorldObject* worldObject = m_targets.GetObjectTarget()) - AddTarget(worldObject, i); - break; - - - // effects which affect caster when no target - // no target added to the spell target list for those - case SPELL_EFFECT_SEND_EVENT: - case SPELL_EFFECT_SPAWN: - case SPELL_EFFECT_DUMMY: - case SPELL_EFFECT_TRIGGER_SPELL: // null target types - cast by caster on self - case SPELL_EFFECT_SKILL: - // effects which always affect caster - // no target added to the spell target list for those - case SPELL_EFFECT_PROFICIENCY: - case SPELL_EFFECT_PARRY: - case SPELL_EFFECT_DODGE: - case SPELL_EFFECT_EVADE: - case SPELL_EFFECT_BLOCK: - case SPELL_EFFECT_STUCK: - case SPELL_EFFECT_WEAPON: - case SPELL_EFFECT_DEFENSE: - case SPELL_EFFECT_SPELL_DEFENSE: - case SPELL_EFFECT_LANGUAGE: - case SPELL_EFFECT_TRADE_SKILL: - case SPELL_EFFECT_STEALTH: - case SPELL_EFFECT_DETECT: - case SPELL_EFFECT_ATTACK: - case SPELL_EFFECT_SELF_RESURRECT: - case SPELL_EFFECT_SUMMON_PLAYER: - case SPELL_EFFECT_152: - case SPELL_EFFECT_TITAN_GRIP: - case SPELL_EFFECT_TRIGGER_SPELL_2: - case SPELL_EFFECT_DESTROY_ALL_TOTEMS: - case SPELL_EFFECT_CAST_BUTTON: - case SPELL_EFFECT_131: - case SPELL_EFFECT_FORCE_DESELECT: - // do nothing - - - case SPELL_EFFECT_BIND: case SPELL_EFFECT_RESURRECT: case SPELL_EFFECT_CREATE_ITEM: @@ -785,9 +702,35 @@ void Spell::SelectSpellTargets() case SPELL_EFFECT_SUMMON_OBJECT_WILD: case SPELL_EFFECT_SELF_RESURRECT: case SPELL_EFFECT_REPUTATION: + case SPELL_EFFECT_LEARN_SPELL: case SPELL_EFFECT_SEND_TAXI: 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->Effects[i].Effect == SPELL_EFFECT_TRIGGER_SPELL) + AddUnitTarget(m_caster, i); + break; + case SPELL_EFFECT_SUMMON_PLAYER: + if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->ToPlayer()->GetSelection()) + { + Player* target = ObjectAccessor::FindPlayer(m_caster->ToPlayer()->GetSelection()); + if (target) + AddUnitTarget(target, i); + } + break; + case SPELL_EFFECT_RESURRECT_NEW: + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); + if (m_targets.GetCorpseTargetGUID()) + { + Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID()); + if (corpse) + { + Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID()); + if (owner) + AddUnitTarget(owner, i); + } + } break; case SPELL_EFFECT_SUMMON_CHANGE_ITEM: case SPELL_EFFECT_ADD_FARSIGHT: @@ -805,14 +748,30 @@ void Spell::SelectSpellTargets() case SPELL_EFFECT_APPLY_AURA: switch(m_spellInfo->Effects[i].ApplyAuraName) { + case SPELL_AURA_ADD_FLAT_MODIFIER: // some spell mods auras have 0 target modes instead expected TARGET_UNIT_CASTER(1) (and present for other ranks for same spell for example) + case SPELL_AURA_ADD_PCT_MODIFIER: + AddUnitTarget(m_caster, i); + break; default: // apply to target in other case if (m_targets.GetUnitTarget()) AddUnitTarget(m_targets.GetUnitTarget(), i); - else - AddUnitTarget(m_caster, i); break; } break; + case SPELL_EFFECT_SKIN_PLAYER_CORPSE: + if (m_targets.GetUnitTarget()) + AddUnitTarget(m_targets.GetUnitTarget(), i); + else if (m_targets.GetCorpseTargetGUID()) + { + Corpse *corpse = ObjectAccessor::GetCorpse(*m_caster, m_targets.GetCorpseTargetGUID()); + if (corpse) + { + Player* owner = ObjectAccessor::FindPlayer(corpse->GetOwnerGUID()); + if (owner) + AddUnitTarget(owner, i); + } + } + break; default: AddUnitTarget(m_caster, i); break; @@ -1238,7 +1197,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) } // Do not take combo points on dodge and miss - if (m_needComboPoints && m_targets.GetObjectTargetGUID() == target->targetGUID) + if (m_needComboPoints && m_targets.GetUnitTargetGUID() == target->targetGUID) if (missInfo != SPELL_MISS_NONE) { m_needComboPoints = false; @@ -2400,7 +2359,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur) AddGOTarget(m_targets.GetGOTarget(), i); break; case TARGET_GAMEOBJECT_ITEM: - if (m_targets.GetGOTarget()) + if (m_targets.GetGOTargetGUID()) AddGOTarget(m_targets.GetGOTarget(), i); else if (m_targets.GetItemTarget()) AddItemTarget(m_targets.GetItemTarget(), i); @@ -2850,7 +2809,7 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered m_targets = *targets; - if (!m_targets.GetObjectTargetGUID() && 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) @@ -3109,7 +3068,7 @@ void Spell::cast(bool skipCheck) else { // cancel at lost main target unit - if (m_targets.GetObjectTargetGUID() && m_targets.GetObjectTargetGUID() != m_caster->GetGUID()) + if (m_targets.GetUnitTargetGUID() && m_targets.GetUnitTargetGUID() != m_caster->GetGUID()) { cancel(); return; @@ -3535,7 +3494,7 @@ void Spell::update(uint32 difftime) // update pointers based at it's GUIDs UpdatePointers(); - if (m_targets.GetObjectTargetGUID() && !m_targets.GetObjectTarget()) + 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(); @@ -4347,7 +4306,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.GetObjectTargetGUID()) + if (uint64 targetGUID = m_targets.GetUnitTargetGUID()) for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) if (ihit->targetGUID == targetGUID) { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 388fe1ec0c5..dfb45550d38 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -133,16 +133,10 @@ class SpellCastTargets uint32 GetTargetMask() const { return m_targetMask; } void SetTargetMask(uint32 newMask) { m_targetMask = newMask; } - uint64 GetObjectTargetGUID() const { return m_objectTargetGUID; } - WorldObject * GetObjectTarget() const { return m_objectTarget; } - Unit* GetUnitTarget() const { return m_objectTarget ? m_objectTarget->ToUnit() : NULL; } + uint64 GetUnitTargetGUID() const { return m_unitTargetGUID; } + Unit* GetUnitTarget() const { return m_unitTarget; } void SetUnitTarget(Unit* target); - GameObject* GetGOTarget() const { return m_objectTarget ? m_objectTarget->ToUnit() : NULL;; } - void SetGOTarget(GameObject* target); - - void SetCorpseTarget(Corpse* corpse); - Position const* GetSrc() const; void SetSrc(float x, float y, float z); void SetSrc(Position const& pos); @@ -156,6 +150,13 @@ class SpellCastTargets void SetDst(SpellCastTargets const& spellTargets); void ModDst(Position const& 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; } @@ -183,10 +184,15 @@ class SpellCastTargets private: uint32 m_targetMask; - WorldObject* m_objectTarget; // can be used at spell creating and after Update + // objects (can be used at spell creating and after Update at casting + Unit* m_unitTarget; + GameObject* m_GOTarget; + Item* m_itemTarget; // object GUID/etc, can be used always - uint64 m_objectTargetGUID; + uint64 m_unitTargetGUID; + uint64 m_GOTargetGUID; + uint64 m_CorpseTargetGUID; uint64 m_itemTargetGUID; uint32 m_itemTargetEntry; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9091bed7b4f..2e8f9960a63 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5834,14 +5834,14 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex) void Spell::EffectParry(SpellEffIndex /*effIndex*/) { - if (m_caster->GetTypeId() == TYPEID_PLAYER) - m_caster->ToPlayer()->SetCanParry(true); + if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) + unitTarget->ToPlayer()->SetCanParry(true); } void Spell::EffectBlock(SpellEffIndex /*effIndex*/) { - if (m_caster->GetTypeId() == TYPEID_PLAYER) - m_caster->ToPlayer()->SetCanBlock(true); + if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) + unitTarget->ToPlayer()->SetCanBlock(true); } void Spell::EffectLeap(SpellEffIndex /*effIndex*/) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 12ffdf5238a..8f89228513a 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -99,264 +99,6 @@ void SpellImplicitTargetInfo::InitTypeData() switch (i) { case TARGET_UNIT_CASTER: - case TARGET_UNIT_NEARBY_ENTRY: - case TARGET_UNIT_NEARBY_ENEMY: - case TARGET_UNIT_NEARBY_ALLY: - case TARGET_UNIT_NEARBY_PARTY: - case TARGET_UNIT_NEARBY_RAID: - case TARGET_DEST_NEARBY_ENTRY: - case TARGET_UNIT_PET: - case TARGET_UNIT_MASTER: - case TARGET_UNIT_SUMMONER: - case TARGET_UNIT_VEHICLE: - case TARGET_UNIT_PASSENGER_0: - case TARGET_UNIT_PASSENGER_1: - case TARGET_UNIT_PASSENGER_2: - case TARGET_UNIT_PASSENGER_3: - case TARGET_UNIT_PASSENGER_4: - case TARGET_UNIT_PASSENGER_5: - case TARGET_UNIT_PASSENGER_6: - case TARGET_UNIT_PASSENGER_7: - case TARGET_DEST_CHANNEL_TARGET: - case TARGET_UNIT_CHANNEL_TARGET: - case TARGET_DEST_CHANNEL_CASTER: - case TARGET_UNIT_AREA_PARTY: - case TARGET_UNIT_AREA_RAID: - case TARGET_UNIT_CONE_ENEMY_24: - case TARGET_UNIT_CONE_ENEMY_54: - case TARGET_UNIT_CONE_ENEMY_104: - case TARGET_UNIT_CONE_ALLY: - case TARGET_UNIT_CONE_ENTRY: - case TARGET_GAMEOBJECT_CONE: - case TARGET_GAMEOBJECT_NEARBY_ENTRY: - case TARGET_SRC_CASTER: - case TARGET_DEST_HOME: - case TARGET_DEST_DB: - case TARGET_DEST_CASTER: - case TARGET_DEST_CASTER_SUMMON: - case TARGET_DEST_CASTER_FISHING: - case TARGET_DEST_CASTER_FRONT_LEAP: - case TARGET_DEST_CASTER_UNKNOWN_36: - case TARGET_DEST_CASTER_FRONT: - case TARGET_DEST_CASTER_BACK: - case TARGET_DEST_CASTER_RIGHT: - case TARGET_DEST_CASTER_LEFT: - case TARGET_DEST_CASTER_FRONT_RIGHT: - case TARGET_DEST_CASTER_BACK_RIGHT: - case TARGET_DEST_CASTER_BACK_LEFT: - case TARGET_DEST_CASTER_FRONT_LEFT: - case TARGET_DEST_CASTER_RANDOM: - case TARGET_DEST_CASTER_RADIUS: - ReferenceType[i] = TARGET_REFERENCE_TYPE_CASTER; - break; - case TARGET_UNIT_TARGET_ENEMY: - case TARGET_UNIT_TARGET_ALLY: - case TARGET_UNIT_TARGET_ANY: - case TARGET_UNIT_TARGET_PARTY: - case TARGET_UNIT_TARGET_RAID: - case TARGET_UNIT_TARGET_RAID_OR_PARTY: - case TARGET_UNIT_TARGET_MINIPET: - case TARGET_UNIT_TARGET_PASSENGER: - case TARGET_UNIT_TARGET_AREA_PARTY: - case TARGET_UNIT_TARGET_RAID_AREA_CLASS: - case TARGET_UNIT_TARGET_CASTER_SRC: - case TARGET_GAMEOBJECT_TARGET: - case TARGET_GAMEOBJECT_ITEM_TARGET: - case TARGET_DEST_TARGET_ANY: - case TARGET_DEST_TARGET_ENEMY: - case TARGET_DEST_TARGET_FRONT: - case TARGET_DEST_TARGET_BACK: - case TARGET_DEST_TARGET_RIGHT: - case TARGET_DEST_TARGET_LEFT: - case TARGET_DEST_TARGET_FRONT_RIGHT: - case TARGET_DEST_TARGET_BACK_RIGHT: - case TARGET_DEST_TARGET_BACK_LEFT: - case TARGET_DEST_TARGET_FRONT_LEFT: - case TARGET_DEST_TARGET_RANDOM: - case TARGET_DEST_TARGET_RADIUS: - ReferenceType[i] = TARGET_REFERENCE_TYPE_TARGET; - break; - case TARGET_UNIT_AREA_ENTRY_SRC: - case TARGET_UNIT_AREA_ENEMY_SRC: - case TARGET_UNIT_AREA_ALLY_SRC: - case TARGET_UNIT_AREA_PARTY_SRC: - case TARGET_GAMEOBJECT_AREA_SRC: - ReferenceType[i] = TARGET_REFERENCE_TYPE_SRC; - break; - case TARGET_UNIT_AREA_ENTRY_DST: - case TARGET_UNIT_AREA_ENEMY_DST: - case TARGET_UNIT_AREA_ALLY_DST: - case TARGET_UNIT_AREA_PARTY_DST: - case TARGET_GAMEOBJECT_AREA_DST: - case TARGET_DEST_DEST_FRONT: - case TARGET_DEST_DEST_BACK: - case TARGET_DEST_DEST_RIGHT: - case TARGET_DEST_DEST_LEFT: - case TARGET_DEST_DEST_FRONT_RIGHT: - case TARGET_DEST_DEST_BACK_RIGHT: - case TARGET_DEST_DEST_BACK_LEFT: - case TARGET_DEST_DEST_FRONT_LEFT: - case TARGET_DEST_DEST_RANDOM: - case TARGET_DEST_DEST_RANDOM_DIR_DIST: - case TARGET_DEST_DEST: - case TARGET_DEST_DYNOBJ_ENEMY: - case TARGET_DEST_DYNOBJ_ALLY: - case TARGET_DEST_DYNOBJ_NONE: - case TARGET_DEST_TRAJ: - ReferenceType[i] = TARGET_REFERENCE_TYPE_DST; - break; - } - } - for (uint8 i = 0; i < TOTAL_SPELL_TARGETS; ++i) - { - switch (i) - { - case TARGET_UNIT_CASTER: - case TARGET_UNIT_NEARBY_ENTRY: - case TARGET_UNIT_NEARBY_ENEMY: - case TARGET_UNIT_NEARBY_ALLY: - case TARGET_UNIT_NEARBY_PARTY: - case TARGET_UNIT_NEARBY_RAID: - case TARGET_UNIT_PET: - case TARGET_UNIT_MASTER: - case TARGET_UNIT_SUMMONER: - case TARGET_UNIT_VEHICLE: - case TARGET_UNIT_PASSENGER_0: - case TARGET_UNIT_PASSENGER_1: - case TARGET_UNIT_PASSENGER_2: - case TARGET_UNIT_PASSENGER_3: - case TARGET_UNIT_PASSENGER_4: - case TARGET_UNIT_PASSENGER_5: - case TARGET_UNIT_PASSENGER_6: - case TARGET_UNIT_PASSENGER_7: - case TARGET_UNIT_CHANNEL_TARGET: - case TARGET_UNIT_AREA_PARTY: - case TARGET_UNIT_AREA_RAID: - case TARGET_UNIT_CONE_ENEMY_24: - case TARGET_UNIT_CONE_ENEMY_54: - case TARGET_UNIT_CONE_ENEMY_104: - case TARGET_UNIT_CONE_ALLY: - case TARGET_UNIT_CONE_ENTRY: - case TARGET_UNIT_TARGET_ENEMY: - case TARGET_UNIT_TARGET_ALLY: - case TARGET_UNIT_TARGET_ANY: - case TARGET_UNIT_TARGET_PARTY: - case TARGET_UNIT_TARGET_RAID: - case TARGET_UNIT_TARGET_RAID_OR_PARTY: - case TARGET_UNIT_TARGET_MINIPET: - case TARGET_UNIT_TARGET_PASSENGER: - case TARGET_UNIT_TARGET_AREA_PARTY: - case TARGET_UNIT_TARGET_RAID_AREA_CLASS: - case TARGET_UNIT_TARGET_CASTER_SRC: - case TARGET_UNIT_AREA_ENTRY_SRC: - case TARGET_UNIT_AREA_ENEMY_SRC: - case TARGET_UNIT_AREA_ALLY_SRC: - case TARGET_UNIT_AREA_PARTY_SRC: - - case TARGET_DEST_NEARBY_ENTRY: - case TARGET_DEST_CHANNEL_TARGET: - case TARGET_DEST_CHANNEL_CASTER: - case TARGET_DEST_HOME: - case TARGET_DEST_DB: - case TARGET_DEST_CASTER: - case TARGET_DEST_CASTER_SUMMON: - case TARGET_DEST_CASTER_FISHING: - case TARGET_DEST_CASTER_FRONT_LEAP: - case TARGET_DEST_CASTER_UNKNOWN_36: - case TARGET_DEST_CASTER_FRONT: - case TARGET_DEST_CASTER_BACK: - case TARGET_DEST_CASTER_RIGHT: - case TARGET_DEST_CASTER_LEFT: - case TARGET_DEST_CASTER_FRONT_RIGHT: - case TARGET_DEST_CASTER_BACK_RIGHT: - case TARGET_DEST_CASTER_BACK_LEFT: - case TARGET_DEST_CASTER_FRONT_LEFT: - case TARGET_DEST_CASTER_RANDOM: - case TARGET_DEST_CASTER_RADIUS: - case TARGET_DEST_TARGET_ANY: - case TARGET_DEST_TARGET_ENEMY: - case TARGET_DEST_TARGET_FRONT: - case TARGET_DEST_TARGET_BACK: - case TARGET_DEST_TARGET_RIGHT: - case TARGET_DEST_TARGET_LEFT: - case TARGET_DEST_TARGET_FRONT_RIGHT: - case TARGET_DEST_TARGET_BACK_RIGHT: - case TARGET_DEST_TARGET_BACK_LEFT: - case TARGET_DEST_TARGET_FRONT_LEFT: - case TARGET_DEST_TARGET_RANDOM: - case TARGET_DEST_TARGET_RADIUS: - case TARGET_DEST_DEST_FRONT: - case TARGET_DEST_DEST_BACK: - case TARGET_DEST_DEST_RIGHT: - case TARGET_DEST_DEST_LEFT: - case TARGET_DEST_DEST_FRONT_RIGHT: - case TARGET_DEST_DEST_BACK_RIGHT: - case TARGET_DEST_DEST_BACK_LEFT: - case TARGET_DEST_DEST_FRONT_LEFT: - case TARGET_DEST_DEST_RANDOM: - case TARGET_DEST_DEST_RANDOM_DIR_DIST: - case TARGET_DEST_DEST: - case TARGET_DEST_DYNOBJ_ENEMY: - case TARGET_DEST_DYNOBJ_ALLY: - case TARGET_DEST_DYNOBJ_NONE: - case TARGET_DEST_TRAJ: - - case TARGET_GAMEOBJECT_CONE: - case TARGET_GAMEOBJECT_NEARBY_ENTRY: - case TARGET_GAMEOBJECT_TARGET: - case TARGET_GAMEOBJECT_ITEM_TARGET: - case TARGET_GAMEOBJECT_AREA_SRC: - case TARGET_GAMEOBJECT_AREA_DST: - - case TARGET_SRC_CASTER: - } - } - - for (uint8 i = 0; i < TOTAL_SPELL_TARGETS; ++i) - { - switch (i) - { - case TARGET_DEST_CHANNEL_TARGET: - case TARGET_UNIT_CHANNEL_TARGET: - case TARGET_DEST_CHANNEL_CASTER: - TARGET_SELECT_TYPE_CHANNEL - - case TARGET_UNIT_CONE_ENEMY_24: - case TARGET_UNIT_CONE_ENEMY_54: - case TARGET_UNIT_CONE_ENEMY_104: - case TARGET_UNIT_CONE_ALLY: - case TARGET_UNIT_CONE_ENTRY: - case TARGET_GAMEOBJECT_CONE: - - case TARGET_UNIT_NEARBY_ENTRY: - case TARGET_UNIT_NEARBY_ENEMY: - case TARGET_UNIT_NEARBY_ALLY: - case TARGET_UNIT_NEARBY_PARTY: - case TARGET_UNIT_NEARBY_RAID: - case TARGET_DEST_NEARBY_ENTRY: - case TARGET_GAMEOBJECT_NEARBY_ENTRY: - - case TARGET_UNIT_AREA_PARTY: - case TARGET_UNIT_AREA_RAID: - case TARGET_UNIT_TARGET_AREA_PARTY: - case TARGET_UNIT_TARGET_RAID_AREA_CLASS: - case TARGET_UNIT_AREA_ENTRY_SRC: - case TARGET_UNIT_AREA_ENEMY_SRC: - case TARGET_UNIT_AREA_ALLY_SRC: - case TARGET_UNIT_AREA_PARTY_SRC: - case TARGET_GAMEOBJECT_AREA_SRC: - case TARGET_UNIT_AREA_ENTRY_DST: - case TARGET_UNIT_AREA_ENEMY_DST: - case TARGET_UNIT_AREA_ALLY_DST: - case TARGET_UNIT_AREA_PARTY_DST: - case TARGET_GAMEOBJECT_AREA_DST: - } - } - for (uint8 i = 0; i < TOTAL_SPELL_TARGETS; ++i) - { - switch (i) - { - case TARGET_UNIT_CASTER: case TARGET_UNIT_CASTER_FISHING: case TARGET_UNIT_MASTER: case TARGET_UNIT_PET: diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 5d901e497c4..9cf75b06d3b 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -41,31 +41,6 @@ enum SpellEffectTargetTypes SPELL_REQUIRE_GOBJECT, }; -enum SpellTargetReferenceTypes -{ - TARGET_REFERENCE_TYPE_CASTER, - TARGET_REFERENCE_TYPE_TARGET, - TARGET_REFERENCE_TYPE_SRC, - TARGET_REFERENCE_TYPE_DEST, -}; - -enum SpellTargetObjectTypes -{ - TARGET_OBJECT_TYPE_SRC, - TARGET_OBJECT_TYPE_DEST, - TARGET_OBJECT_TYPE_UNIT, - TARGET_OBJECT_TYPE_GAMEOBJECT, -}; - -enum SpellTargetSelectTypes -{ - TARGET_SELECT_TYPE_DEFAULT, - TARGET_SELECT_TYPE_CHANNEL, - TARGET_SELECT_TYPE_NEARBY, - TARGET_SELECT_TYPE_CONE, - TARGET_SELECT_TYPE_AREA, -}; - enum SpellSelectTargetTypes { TARGET_TYPE_DEFAULT, |