diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-14 16:52:13 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-14 16:52:13 +0200 |
commit | 11ecb9c63339bcf5de3a87374d8d2e12cd79d249 (patch) | |
tree | f66675905fa77433e073d7cc9c17baaab011382f /src | |
parent | c8b722e4a44195ab757f0b4d454f92767d65d45f (diff) | |
parent | 5890f95f7cd7a885b667fe9b5da2dceea22b9b81 (diff) |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/Entities/Unit/Unit.cpp
src/server/game/Entities/Unit/Unit.h
src/server/game/Handlers/PetHandler.cpp
src/server/game/Spells/Spell.cpp
src/server/game/Spells/Spell.h
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Totem/Totem.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 8 | ||||
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 58 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 3 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp | 12 |
9 files changed, 67 insertions, 83 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index f43a7f91f32..c5b5cd5dfef 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -433,11 +433,12 @@ void SmartAI::MovementInform(uint32 MovementType, uint32 Data) void SmartAI::RemoveAuras() { + /// @fixme: duplicated logic in CreatureAI::_EnterEvadeMode (could use RemoveAllAurasExceptType) Unit::AuraApplicationMap& appliedAuras = me->GetAppliedAuras(); for (Unit::AuraApplicationMap::iterator iter = appliedAuras.begin(); iter != appliedAuras.end();) { Aura const* aura = iter->second->GetBase(); - if (!aura->IsPassive() && !aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE) && aura->GetCasterGUID() != me->GetGUID()) + if (!aura->IsPassive() && !aura->HasEffectType(SPELL_AURA_CONTROL_VEHICLE) && !aura->HasEffectType(SPELL_AURA_CLONE_CASTER) && aura->GetCasterGUID() != me->GetGUID()) me->RemoveAura(iter); else ++iter; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 4fa02decdf8..088098275e9 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1506,16 +1506,16 @@ void Pet::InitLevelupSpellsForLevel() { for (uint8 i = 0; i < MAX_CREATURE_SPELL_DATA_SLOT; ++i) { - SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(defSpells->spellid[i]); - if (!spellEntry) + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(defSpells->spellid[i]); + if (!spellInfo) continue; // will called first if level down - if (spellEntry->SpellLevel > level) - unlearnSpell(spellEntry->Id, true); + if (spellInfo->SpellLevel > level) + unlearnSpell(spellInfo->Id, true); // will called if level up else - learnSpell(spellEntry->Id); + learnSpell(spellInfo->Id); } } } diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index efdf386f80e..9784f6194ee 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -107,7 +107,7 @@ void Totem::UnSummon(uint32 msTime) RemoveAurasDueToSpell(GetSpell(), GetGUID()); // clear owner's totem slot - for (int i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) + for (uint8 i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) { if (GetOwner()->m_SummonSlot[i] == GetGUID()) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8f7c26e3ab6..27e8453cfc3 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -162,7 +162,7 @@ ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, #endif Unit::Unit(bool isWorldObject) : WorldObject(isWorldObject), m_movedPlayer(NULL), m_lastSanctuaryTime(0), - m_TempSpeed(0.0f), IsAIEnabled(false), NeedChangeAI(false), + IsAIEnabled(false), NeedChangeAI(false), m_ControlledByPlayer(false), movespline(new Movement::MoveSpline()), i_AI(NULL), i_disabledAI(NULL), m_AutoRepeatFirstCast(false), m_procDeep(0), m_removedAurasCount(0), i_motionMaster(this), m_ThreatManager(this), @@ -195,8 +195,6 @@ Unit::Unit(bool isWorldObject) : for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i) m_currentSpells[i] = NULL; - m_addDmgOnce = 0; - for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i) m_SummonSlot[i] = 0; @@ -12631,18 +12629,6 @@ Player* Unit::GetSpellModOwner() const } ///----------Pet responses methods----------------- -void Unit::SendPetCastFail(uint8 castCount, SpellInfo const* spellInfo, SpellCastResult result) -{ - if (result == SPELL_CAST_OK) - return; - - Unit* owner = GetCharmerOrOwner(); - if (!owner || owner->GetTypeId() != TYPEID_PLAYER) - return; - - Spell::SendCastResult(owner->ToPlayer(), spellInfo, castCount, result, SPELL_CUSTOM_ERROR_NONE, SMSG_PET_CAST_FAILED); -} - void Unit::SendPetActionFeedback(uint8 msg) { Unit* owner = GetOwner(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index c51be5d460e..9aade75a536 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -967,7 +967,8 @@ struct CalcDamageInfo }; // Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode -struct SpellNonMeleeDamage{ +struct SpellNonMeleeDamage +{ SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask) : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), overkill(0), schoolMask(_schoolMask), absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0) @@ -1851,7 +1852,6 @@ class Unit : public WorldObject Spell* FindCurrentSpellBySpellId(uint32 spell_id) const; int32 GetCurrentSpellCastTime(uint32 spell_id) const; - uint32 m_addDmgOnce; uint64 m_SummonSlot[MAX_SUMMON_SLOT]; uint64 m_ObjectSlot[MAX_GAMEOBJECT_SLOT]; @@ -2004,9 +2004,6 @@ class Unit : public WorldObject float GetSpeed(UnitMoveType mtype) const; float GetSpeedRate(UnitMoveType mtype) const { return m_speed_rate[mtype]; } void SetSpeed(UnitMoveType mtype, float rate, bool forced = false); - float m_TempSpeed; - - bool isHover() const { return HasAuraType(SPELL_AURA_HOVER); } float ApplyEffectModifiers(SpellInfo const* spellProto, uint8 effect_index, float value) const; int32 CalculateSpellDamage(Unit const* target, SpellInfo const* spellProto, uint8 effect_index, int32 const* basePoints = NULL) const; @@ -2049,7 +2046,6 @@ class Unit : public WorldObject void ClearComboPointHolders(); ///----------Pet responses methods----------------- - void SendPetCastFail(uint8 castCount, SpellInfo const* spellInfo, SpellCastResult result); void SendPetActionFeedback (uint8 msg); void SendPetTalk (uint32 pettalk); void SendPetAIReaction(uint64 guid); diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index a608eb500c7..2e7ca070924 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -312,10 +312,6 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint32 spellid return; } - if (spellInfo->StartRecoveryCategory > 0) - if (pet->GetCharmInfo() && pet->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo)) - return; - for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_SRC_AREA_ENEMY || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_UNIT_DEST_AREA_ENEMY || spellInfo->Effects[i].TargetA.GetTarget() == TARGET_DEST_DYNOBJ_ENEMY) @@ -395,10 +391,10 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint32 spellid } else { - if (pet->isPossessed() || pet->IsVehicle()) + if (pet->isPossessed() || pet->IsVehicle()) /// @todo: confirm this check Spell::SendCastResult(GetPlayer(), spellInfo, 0, result); else - pet->SendPetCastFail(0, spellInfo, result); + spell->SendPetCastResult(result); if (!pet->ToCreature()->HasSpellCooldown(spellid)) GetPlayer()->SendClearCooldown(spellid, pet); @@ -780,13 +776,6 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) return; } - if (spellInfo->StartRecoveryCategory > 0) // Check if spell is affected by GCD - if (caster->GetTypeId() == TYPEID_UNIT && caster->GetCharmInfo() && caster->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo)) - { - caster->SendPetCastFail(castCount, spellInfo, SPELL_FAILED_NOT_READY); - return; - } - // do not cast not learned spells if (!caster->HasSpell(spellId) || spellInfo->IsPassive()) return; @@ -801,25 +790,19 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) spell->m_cast_count = castCount; // probably pending spell cast spell->m_targets = targets; - /// @todo need to check victim? - SpellCastResult result; - if (caster->m_movedPlayer) - result = spell->CheckPetCast(caster->m_movedPlayer->GetSelectedUnit()); - else - result = spell->CheckPetCast(NULL); + SpellCastResult result = spell->CheckPetCast(NULL); + if (result == SPELL_CAST_OK) { - if (caster->GetTypeId() == TYPEID_UNIT) + if (Creature* creature = caster->ToCreature()) { - Creature* pet = caster->ToCreature(); - pet->AddCreatureSpellCooldown(spellId); - if (pet->IsPet()) + creature->AddCreatureSpellCooldown(spellId); + if (Pet* pet = creature->ToPet()) { - Pet* p = (Pet*)pet; // 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 - if (p->getPetType() == SUMMON_PET && (urand(0, 100) < 10)) - pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL); + if (pet->getPetType() == SUMMON_PET && (urand(0, 100) < 10)) + pet->SendPetTalk(PET_TALK_SPECIAL_SPELL); else pet->SendPetAIReaction(guid); } @@ -829,7 +812,8 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) } else { - caster->SendPetCastFail(castCount, spellInfo, result); + spell->SendPetCastResult(result); + if (caster->GetTypeId() == TYPEID_PLAYER) { if (!caster->ToPlayer()->HasSpellCooldown(spellId)) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4bffd35af38..7b30c3e6634 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2025,6 +2025,15 @@ void Spell::SearchChainTargets(std::list<WorldObject*>& targets, uint32 chainTar } } +GameObject* Spell::SearchSpellFocus() +{ + GameObject* focus = NULL; + Trinity::GameObjectFocusCheck check(m_caster, m_spellInfo->RequiresSpellFocus); + Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck> searcher(m_caster, focus, check); + SearchTargets<Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck> > (searcher, GRID_MAP_TYPE_MASK_GAMEOBJECT, m_caster, m_caster, m_caster->GetVisibilityRange()); + return focus; +} + void Spell::prepareDataForTriggerSystem(AuraEffect const* /*triggeredByAura*/) { //========================================================================================== @@ -3777,13 +3786,25 @@ void Spell::SendCastResult(SpellCastResult result) SendCastResult(m_caster->ToPlayer(), m_spellInfo, m_cast_count, result, m_customError); } +void Spell::SendPetCastResult(SpellCastResult result) +{ + if (result == SPELL_CAST_OK) + return; + + Unit* owner = m_caster->GetCharmerOrOwner(); + if (!owner || owner->GetTypeId() != TYPEID_PLAYER) + return; + + SendCastResult(owner->ToPlayer(), m_spellInfo, m_cast_count, result, SPELL_CUSTOM_ERROR_NONE, SMSG_PET_CAST_FAILED); +} + void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, Opcodes opcode /*= SMSG_CAST_FAILED*/) { if (result == SPELL_CAST_OK) return; WorldPacket data(opcode, (4+1+1)); - data << uint8(cast_count); // single cast or multi 2.3 (0/1) + data << uint8(cast_count); data << uint32(spellInfo->Id); data << uint8(result); // problem switch (result) @@ -5053,9 +5074,17 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_NOT_MOUNTED; } + // check spell focus object + if (m_spellInfo->RequiresSpellFocus) + { + focusObject = SearchSpellFocus(); + if (!focusObject) + return SPELL_FAILED_REQUIRES_SPELL_FOCUS; + } + SpellCastResult castResult = SPELL_CAST_OK; - // always (except passive spells) check items (focus object can be required for any type casts) + // always (except passive spells) check items (only player related checks) if (!m_spellInfo->IsPassive()) { castResult = CheckItems(); @@ -5655,6 +5684,11 @@ SpellCastResult Spell::CheckPetCast(Unit* target) if (creatureCaster->HasSpellCooldown(m_spellInfo->Id)) return SPELL_FAILED_NOT_READY; + // Check if spell is affected by GCD + if (m_spellInfo->StartRecoveryCategory > 0) + if (m_caster->GetCharmInfo() && m_caster->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(m_spellInfo)) + return SPELL_FAILED_NOT_READY; + return CheckCast(true); } @@ -6049,26 +6083,6 @@ SpellCastResult Spell::CheckItems() return SPELL_FAILED_EQUIPPED_ITEM_CLASS; } - // check spell focus object - if (m_spellInfo->RequiresSpellFocus) - { - CellCoord p(Trinity::ComputeCellCoord(m_caster->GetPositionX(), m_caster->GetPositionY())); - Cell cell(p); - - GameObject* ok = NULL; - Trinity::GameObjectFocusCheck go_check(m_caster, m_spellInfo->RequiresSpellFocus); - Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck> checker(m_caster, ok, go_check); - - TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectFocusCheck>, GridTypeMapContainer > object_checker(checker); - Map& map = *m_caster->GetMap(); - cell.Visit(p, object_checker, map, *m_caster, m_caster->GetVisibilityRange()); - - if (!ok) - return SPELL_FAILED_REQUIRES_SPELL_FOCUS; - - focusObject = ok; // game object found in range - } - // do not take reagents for these item casts if (!(m_CastItem && m_CastItem->GetTemplate()->Flags & ITEM_PROTO_FLAG_TRIGGERED_CAST)) { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 244615c848a..37316e1d6bb 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -375,6 +375,8 @@ class Spell void SearchAreaTargets(std::list<WorldObject*>& targets, float range, Position const* position, Unit* referer, SpellTargetObjectTypes objectType, SpellTargetCheckTypes selectionType, ConditionList* condList); void SearchChainTargets(std::list<WorldObject*>& targets, uint32 chainTargets, WorldObject* target, SpellTargetObjectTypes objectType, SpellTargetCheckTypes selectType, ConditionList* condList, bool isChainHeal); + GameObject* SearchSpellFocus(); + void prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura = NULL); void cancel(); void update(uint32 difftime); @@ -422,6 +424,7 @@ class Spell static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, Opcodes opcode = SMSG_CAST_FAILED); void SendCastResult(SpellCastResult result); + void SendPetCastResult(SpellCastResult result); void SendSpellStart(); void SendSpellGo(); void SendSpellCooldown(); diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp index 678bd884cb7..9876da73004 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp @@ -23,9 +23,9 @@ enum Spells { SPELL_SEARING_SHADOWS = 96913, - SPEll_FOCUSED_FIRE_FIRST_DAMAGE = 97212, - SPEll_FOCUSED_FIRE_TRIGGER = 96872, - SPEll_FOCUSED_FIRE_VISUAL = 96886, + SPELL_FOCUSED_FIRE_FIRST_DAMAGE = 97212, + SPELL_FOCUSED_FIRE_TRIGGER = 96872, + SPELL_FOCUSED_FIRE_VISUAL = 96886, SPELL_FOCUSED_FIRE = 96884, SPELL_EYES_OF_OCCUTHAR = 96920, SPELL_GAZE_OF_OCCUTHAR = 96942, @@ -95,7 +95,7 @@ class boss_occuthar : public CreatureScript for (uint8 i = 0; i < MAX_OCCUTHAR_VEHICLE_SEATS; ++i) { if (Unit* vehicle = _vehicle->GetPassenger(i)) - vehicle->CastSpell(summon, SPEll_FOCUSED_FIRE_VISUAL); + vehicle->CastSpell(summon, SPELL_FOCUSED_FIRE_VISUAL); } } } @@ -119,7 +119,7 @@ class boss_occuthar : public CreatureScript events.ScheduleEvent(EVENT_SEARING_SHADOWS, 25 * IN_MILLISECONDS); break; case EVENT_FOCUSED_FIRE: - DoCastAOE(SPEll_FOCUSED_FIRE_TRIGGER, true); + DoCastAOE(SPELL_FOCUSED_FIRE_TRIGGER, true); events.ScheduleEvent(EVENT_FOCUSED_FIRE, 15 * IN_MILLISECONDS); break; case EVENT_EYES_OF_OCCUTHAR: @@ -180,7 +180,7 @@ class npc_eyestalk : public CreatureScript if (_events.ExecuteEvent() == EVENT_FOCUSED_FIRE_FIRST_DAMAGE) { - DoCastAOE(SPEll_FOCUSED_FIRE_FIRST_DAMAGE); + DoCastAOE(SPELL_FOCUSED_FIRE_FIRST_DAMAGE); if (++_damageCount < 2) _events.ScheduleEvent(EVENT_FOCUSED_FIRE_FIRST_DAMAGE, 1 * IN_MILLISECONDS); } |