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, 485 insertions, 168 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a7d84a4187f..d9799d81bac 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* inmmuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId); + SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId); if ((itr->type & spellInfo->GetSchoolMask()) - && !(inmmuneSpellInfo->IsPositive() && spellInfo->IsPositive()) - && !spellInfo->CanPierceImmuneAura(inmmuneSpellInfo)) + && !(immuneSpellInfo && immuneSpellInfo->IsPositive() && spellInfo->IsPositive()) + && !spellInfo->CanPierceImmuneAura(immuneSpellInfo)) return true; } } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 4b7825488b9..07e84405128 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1287,65 +1287,64 @@ enum Targets TARGET_UNIT_TARGET_ENEMY = 6, TARGET_UNIT_AREA_ENTRY_SRC = 7, TARGET_UNIT_AREA_ENTRY_DST = 8, - TARGET_DST_HOME = 9, - TARGET_UNIT_TARGET_DEST_CASTER = 11, // teleport target to caster + TARGET_DEST_HOME = 9, + TARGET_UNIT_TARGET_CASTER_SRC = 11, // teleport target to caster TARGET_UNIT_AREA_ENEMY_SRC = 15, TARGET_UNIT_AREA_ENEMY_DST = 16, - TARGET_DST_DB = 17, - TARGET_DST_CASTER = 18, - TARGET_UNIT_PARTY_CASTER = 20, + TARGET_DEST_DB = 17, + TARGET_DEST_CASTER = 18, + TARGET_UNIT_AREA_PARTY = 20, TARGET_UNIT_TARGET_ALLY = 21, TARGET_SRC_CASTER = 22, - TARGET_GAMEOBJECT = 23, - TARGET_UNIT_CONE_ENEMY = 24, + TARGET_GAMEOBJECT_TARGET = 23, + TARGET_UNIT_CONE_ENEMY_24 = 24, TARGET_UNIT_TARGET_ANY = 25, - TARGET_GAMEOBJECT_ITEM = 26, + TARGET_GAMEOBJECT_ITEM_TARGET = 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_MINION = 32, - //TARGET_DEST_SUMMON + TARGET_DEST_CASTER_SUMMON = 32, // front left, 1y from caster TARGET_UNIT_AREA_PARTY_SRC = 33, TARGET_UNIT_AREA_PARTY_DST = 34, TARGET_UNIT_TARGET_PARTY = 35, - TARGET_DEST_CASTER_RANDOM_UNKNOWN = 36, //unknown - TARGET_UNIT_TARGET_ALLY_PARTY = 37, + 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_UNIT_NEARBY_ENTRY = 38, - TARGET_UNIT_CASTER_FISHING = 39, + TARGET_DEST_CASTER_FISHING = 39, TARGET_GAMEOBJECT_NEARBY_ENTRY = 40, - 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_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 = 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_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_TARGET_ENEMY = 53, + TARGET_UNIT_CONE_ENEMY_54 = 54, TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell - TARGET_UNIT_RAID_CASTER = 56, + TARGET_UNIT_AREA_RAID = 56, TARGET_UNIT_TARGET_RAID = 57, TARGET_UNIT_NEARBY_RAID = 58, TARGET_UNIT_CONE_ALLY = 59, TARGET_UNIT_CONE_ENTRY = 60, - TARGET_UNIT_TARGET_CLASS_RAID = 61, + TARGET_UNIT_TARGET_RAID_AREA_CLASS = 61, // targets all units in raid which have class of selected target 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_LEFT = 68, - TARGET_DEST_TARGET_BACK_LEFT = 69, - TARGET_DEST_TARGET_BACK_RIGHT = 70, - TARGET_DEST_TARGET_FRONT_RIGHT = 71, + 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_CASTER_RANDOM = 72, TARGET_DEST_CASTER_RADIUS = 73, TARGET_DEST_TARGET_RANDOM = 74, @@ -1356,10 +1355,10 @@ enum Targets TARGET_DEST_DEST_BACK = 79, TARGET_DEST_DEST_RIGHT = 80, TARGET_DEST_DEST_LEFT = 81, - 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_FRONT_RIGHT = 82, + TARGET_DEST_DEST_BACK_RIGHT = 83, + TARGET_DEST_DEST_BACK_LEFT = 84, + TARGET_DEST_DEST_FRONT_LEFT = 85, TARGET_DEST_DEST_RANDOM = 86, TARGET_DEST_DEST = 87, TARGET_DEST_DYNOBJ_NONE = 88, @@ -1367,7 +1366,7 @@ enum Targets TARGET_UNIT_TARGET_MINIPET = 90, TARGET_DEST_DEST_RANDOM_DIR_DIST = 91, TARGET_UNIT_SUMMONER = 92, - TARGET_CORPSE_AREA_ENEMY_PLAYER_SRC= 93, // TODO + TARGET_CORPSE_AREA_ENEMY_SRC = 93, // TODO TARGET_UNIT_VEHICLE = 94, TARGET_UNIT_TARGET_PASSENGER = 95, TARGET_UNIT_PASSENGER_0 = 96, @@ -1378,12 +1377,12 @@ enum Targets TARGET_UNIT_PASSENGER_5 = 101, TARGET_UNIT_PASSENGER_6 = 102, TARGET_UNIT_PASSENGER_7 = 103, - TARGET_UNIT_AREA_PATH = 104, + TARGET_UNIT_CONE_ENEMY_104 = 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_AREA_PATH = 108, - TARGET_DEST_UNK_110 = 110, // some kind of traj? + TARGET_GAMEOBJECT_CONE = 108, + TARGET_DEST_UNK_110 = 110, TOTAL_SPELL_TARGETS }; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index c63761a3255..ff2e6caf73d 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) + llabs(mutetime); + mutetime = time(NULL) + -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 76fd348018e..56977aaa894 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.GetUnitTargetGUID() == target->GetGUID()) + && (*iter)->GetCurrentSpell(i)->m_targets.GetObjectTargetGUID() == target->GetGUID()) { (*iter)->InterruptSpell(CurrentSpellTypes(i), false); } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index a40ff40d935..d55aa3cc341 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -117,21 +117,15 @@ void SpellCastTargets::Read(ByteBuffer& data, Unit* caster) { data >> m_targetMask; - if (m_targetMask == TARGET_FLAG_SELF) + if (m_targetMask == TARGET_FLAG_NONE) return; - 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_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_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); @@ -177,26 +171,7 @@ 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)) - { - 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); - } + data.append(m_objectTargetGUID); if (m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) { @@ -238,6 +213,18 @@ 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; @@ -330,13 +317,6 @@ 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) @@ -366,11 +346,6 @@ 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; @@ -632,22 +607,7 @@ void Spell::SelectSpellTargets() continue; } - 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) - { + /*// TODO: fix this motherfucker, nothing should be added to spell targets case 20577: // Cannibalize case 54044: // Carrion Feeder { @@ -683,7 +643,80 @@ 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); @@ -693,6 +726,56 @@ 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: @@ -702,35 +785,9 @@ 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: @@ -748,30 +805,14 @@ 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; @@ -1197,7 +1238,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.GetObjectTargetGUID() == target->targetGUID) if (missInfo != SPELL_MISS_NONE) { m_needComboPoints = false; @@ -2359,7 +2400,7 @@ void Spell::SelectEffectTargets(uint32 i, SpellImplicitTargetInfo const& cur) AddGOTarget(m_targets.GetGOTarget(), i); break; case TARGET_GAMEOBJECT_ITEM: - if (m_targets.GetGOTargetGUID()) + if (m_targets.GetGOTarget()) AddGOTarget(m_targets.GetGOTarget(), i); else if (m_targets.GetItemTarget()) AddItemTarget(m_targets.GetItemTarget(), i); @@ -2809,7 +2850,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.GetObjectTargetGUID() && m_spellInfo->Targets & TARGET_FLAG_UNIT) { Unit* target = NULL; if (m_caster->GetTypeId() == TYPEID_UNIT) @@ -3068,7 +3109,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.GetObjectTargetGUID() && m_targets.GetObjectTargetGUID() != m_caster->GetGUID()) { cancel(); return; @@ -3494,7 +3535,7 @@ void Spell::update(uint32 difftime) // update pointers based at it's GUIDs UpdatePointers(); - if (m_targets.GetUnitTargetGUID() && !m_targets.GetUnitTarget()) + if (m_targets.GetObjectTargetGUID() && !m_targets.GetObjectTarget()) { sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell %u is cancelled due to removal of target.", m_spellInfo->Id); cancel(); @@ -4306,7 +4347,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.GetObjectTargetGUID()) 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 dfb45550d38..388fe1ec0c5 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -133,10 +133,16 @@ class SpellCastTargets 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; } + uint64 GetObjectTargetGUID() const { return m_objectTargetGUID; } + WorldObject * GetObjectTarget() const { return m_objectTarget; } + Unit* GetUnitTarget() const { return m_objectTarget ? m_objectTarget->ToUnit() : NULL; } 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); @@ -150,13 +156,6 @@ 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; } @@ -184,15 +183,10 @@ class SpellCastTargets 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; + WorldObject* m_objectTarget; // can be used at spell creating and after Update // object GUID/etc, can be used always - uint64 m_unitTargetGUID; - uint64 m_GOTargetGUID; - uint64 m_CorpseTargetGUID; + uint64 m_objectTargetGUID; uint64 m_itemTargetGUID; uint32 m_itemTargetEntry; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 2e8f9960a63..9091bed7b4f 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 (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - unitTarget->ToPlayer()->SetCanParry(true); + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->ToPlayer()->SetCanParry(true); } void Spell::EffectBlock(SpellEffIndex /*effIndex*/) { - if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - unitTarget->ToPlayer()->SetCanBlock(true); + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->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 8f89228513a..12ffdf5238a 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -99,6 +99,264 @@ 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 9cf75b06d3b..5d901e497c4 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -41,6 +41,31 @@ 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, |
