diff options
| author | Shauren <shauren.trinity@gmail.com> | 2013-02-27 13:17:20 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2013-02-27 13:17:20 +0100 |
| commit | 9301e31a4e895d79c518c0002da7cedeaff5df74 (patch) | |
| tree | 80f28381591f1b656ecc72d340457465ef215b26 /src/server/game/Spells/SpellInfo.cpp | |
| parent | 480c6cf4dd8965627aa7bc6e903558f2fa5c3ea6 (diff) | |
Core/Spells: Allow free casting of player's own spells on vehicle seats with flag VEHICLE_SEAT_FLAG_CAN_ATTACK
Diffstat (limited to 'src/server/game/Spells/SpellInfo.cpp')
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index d2ab1a315e8..aea7689c051 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -23,6 +23,7 @@ #include "ConditionMgr.h" #include "Player.h" #include "Battleground.h" +#include "Vehicle.h" uint32 GetTargetFlagMask(SpellTargetObjectTypes objType) { @@ -1614,6 +1615,56 @@ SpellCastResult SpellInfo::CheckExplicitTarget(Unit const* caster, WorldObject c return SPELL_CAST_OK; } +SpellCastResult SpellInfo::CheckVehicle(Unit const* caster) const +{ + // All creatures should be able to cast as passengers freely, restriction and attribute are only for players + if (caster->GetTypeId() != TYPEID_PLAYER) + return SPELL_CAST_OK; + + Vehicle* vehicle = caster->GetVehicle(); + if (vehicle) + { + uint16 checkMask = 0; + for (uint8 effIndex = EFFECT_0; effIndex < MAX_SPELL_EFFECTS; ++effIndex) + { + if (Effects[effIndex].ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT) + { + SpellShapeshiftEntry const* shapeShiftEntry = sSpellShapeshiftStore.LookupEntry(Effects[effIndex].MiscValue); + if (shapeShiftEntry && (shapeShiftEntry->flags1 & 1) == 0) // unk flag + checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED; + break; + } + } + + if (HasAura(SPELL_AURA_MOUNTED)) + checkMask |= VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL; + + if (!checkMask) + checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK; + + VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster); + if (!(AttributesEx6 & SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !(Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED) + && (vehicleSeat->m_flags & checkMask) != checkMask) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + + // Can only summon uncontrolled minions/guardians when on controlled vehicle + if (vehicleSeat->m_flags & (VEHICLE_SEAT_FLAG_CAN_CONTROL | VEHICLE_SEAT_FLAG_UNK2)) + { + for (uint32 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i) + { + if (Effects[i].Effect != SPELL_EFFECT_SUMMON) + continue; + + SummonPropertiesEntry const* props = sSummonPropertiesStore.LookupEntry(Effects[i].MiscValueB); + if (props && props->Category != SUMMON_CATEGORY_WILD) + return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW; + } + } + } + + return SPELL_CAST_OK; +} + bool SpellInfo::CheckTargetCreatureType(Unit const* target) const { // Curse of Doom & Exorcism: not find another way to fix spell target check :/ |
