aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-02-27 13:17:20 +0100
committerShauren <shauren.trinity@gmail.com>2013-02-27 13:17:20 +0100
commit9301e31a4e895d79c518c0002da7cedeaff5df74 (patch)
tree80f28381591f1b656ecc72d340457465ef215b26 /src/server/game/Spells
parent480c6cf4dd8965627aa7bc6e903558f2fa5c3ea6 (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')
-rw-r--r--src/server/game/Spells/Spell.cpp34
-rw-r--r--src/server/game/Spells/SpellInfo.cpp51
-rw-r--r--src/server/game/Spells/SpellInfo.h1
3 files changed, 58 insertions, 28 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 8c9f51a0f0a..342f0cfbddf 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -4832,34 +4832,12 @@ SpellCastResult Spell::CheckCast(bool strict)
return SPELL_FAILED_MOVING;
}
-
- Vehicle* vehicle = m_caster->GetVehicle();
- if (vehicle && !(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE))
+ // Check vehicle flags
+ if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE))
{
- uint16 checkMask = 0;
- for (uint8 effIndex = EFFECT_0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
- {
- SpellEffectInfo const* effInfo = &m_spellInfo->Effects[effIndex];
- if (effInfo->ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT)
- {
- SpellShapeshiftEntry const* shapeShiftEntry = sSpellShapeshiftStore.LookupEntry(effInfo->MiscValue);
- if (shapeShiftEntry && (shapeShiftEntry->flags1 & 1) == 0) // unk flag
- checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED;
- break;
- }
- }
-
- if (m_spellInfo->HasAura(SPELL_AURA_MOUNTED))
- checkMask |= VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL;
-
- if (!checkMask)
- checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK;
-
- // All creatures should be able to cast as passengers freely, restriction and attribute are only for players
- VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(m_caster);
- if (!(m_spellInfo->AttributesEx6 & SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE) && !(m_spellInfo->Attributes & SPELL_ATTR0_CASTABLE_WHILE_MOUNTED)
- && (vehicleSeat->m_flags & checkMask) != checkMask && m_caster->GetTypeId() == TYPEID_PLAYER)
- return SPELL_FAILED_DONT_REPORT;
+ SpellCastResult vehicleCheck = m_spellInfo->CheckVehicle(m_caster);
+ if (vehicleCheck != SPELL_CAST_OK)
+ return vehicleCheck;
}
// check spell cast conditions from database
@@ -7167,7 +7145,7 @@ bool Spell::CheckScriptEffectImplicitTargets(uint32 effIndex, uint32 effIndexToC
if (((*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
(!(*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && (*targetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)))
return false;
-
+
std::list<SpellScript::ObjectAreaTargetSelectHandler>::iterator areaTargetSelectHookEnd = (*itr)->OnObjectAreaTargetSelect.end(), areaTargetSelectHookItr = (*itr)->OnObjectAreaTargetSelect.begin();
for (; areaTargetSelectHookItr != areaTargetSelectHookEnd; ++areaTargetSelectHookItr)
if (((*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndex) && !(*areaTargetSelectHookItr).IsEffectAffected(m_spellInfo, effIndexToCheck)) ||
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 :/
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index bbc5b61e282..cc0a0101597 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -420,6 +420,7 @@ public:
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player = NULL) const;
SpellCastResult CheckTarget(Unit const* caster, WorldObject const* target, bool implicit = true) const;
SpellCastResult CheckExplicitTarget(Unit const* caster, WorldObject const* target, Item const* itemTarget = NULL) const;
+ SpellCastResult CheckVehicle(Unit const* caster) const;
bool CheckTargetCreatureType(Unit const* target) const;
SpellSchoolMask GetSchoolMask() const;