Core/Spells & Vehicles: Define and implement SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE and VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL.
Research done by QAston
This commit is contained in:
@@ -52,8 +52,9 @@ enum VehicleSeatFlags
|
|||||||
VEHICLE_SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden
|
VEHICLE_SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden
|
||||||
VEHICLE_SEAT_FLAG_UNK11 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing
|
VEHICLE_SEAT_FLAG_UNK11 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing
|
||||||
VEHICLE_SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat
|
VEHICLE_SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat
|
||||||
|
VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL = 0x00001000, // Can cast spells with SPELL_AURA_MOUNTED from seat (possibly 4.x only, 0 seats on 3.3.5a)
|
||||||
VEHICLE_SEAT_FLAG_UNCONTROLLED = 0x00002000, // can override !& VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT
|
VEHICLE_SEAT_FLAG_UNCONTROLLED = 0x00002000, // can override !& VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT
|
||||||
VEHICLE_SEAT_FLAG_CAN_ATTACK = 0x00004000, // Can attack, cast spells and use items from vehicle?
|
VEHICLE_SEAT_FLAG_CAN_ATTACK = 0x00004000, // Can attack, cast spells and use items from vehicle
|
||||||
VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT = 0x02000000, // Lua_CanExitVehicle - can enter and exit at free will
|
VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT = 0x02000000, // Lua_CanExitVehicle - can enter and exit at free will
|
||||||
VEHICLE_SEAT_FLAG_CAN_SWITCH = 0x04000000, // Lua_CanSwitchVehicleSeats
|
VEHICLE_SEAT_FLAG_CAN_SWITCH = 0x04000000, // Lua_CanSwitchVehicleSeats
|
||||||
VEHICLE_SEAT_FLAG_CAN_CAST = 0x20000000, // Lua_UnitHasVehicleUI
|
VEHICLE_SEAT_FLAG_CAN_CAST = 0x20000000, // Lua_UnitHasVehicleUI
|
||||||
@@ -103,6 +104,7 @@ class Vehicle
|
|||||||
{
|
{
|
||||||
friend class Unit;
|
friend class Unit;
|
||||||
friend class WorldSession;
|
friend class WorldSession;
|
||||||
|
friend class Spell;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry);
|
explicit Vehicle(Unit* unit, VehicleEntry const* vehInfo, uint32 creatureEntry);
|
||||||
|
|||||||
@@ -491,7 +491,7 @@ enum SpellAttr6
|
|||||||
SPELL_ATTR6_UNK9 = 0x00000200, // 9
|
SPELL_ATTR6_UNK9 = 0x00000200, // 9
|
||||||
SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS = 0x00000400, // 10 NYI!
|
SPELL_ATTR6_CAN_TARGET_POSSESSED_FRIENDS = 0x00000400, // 10 NYI!
|
||||||
SPELL_ATTR6_NOT_IN_RAID_INSTANCE = 0x00000800, // 11 not usable in raid instance
|
SPELL_ATTR6_NOT_IN_RAID_INSTANCE = 0x00000800, // 11 not usable in raid instance
|
||||||
SPELL_ATTR6_UNK12 = 0x00001000, // 12
|
SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE = 0x00001000, // 12 castable while caster is on vehicle
|
||||||
SPELL_ATTR6_UNK13 = 0x00002000, // 13
|
SPELL_ATTR6_UNK13 = 0x00002000, // 13
|
||||||
SPELL_ATTR6_UNK14 = 0x00004000, // 14
|
SPELL_ATTR6_UNK14 = 0x00004000, // 14
|
||||||
SPELL_ATTR6_UNK15 = 0x00008000, // 15 not set in 3.0.3
|
SPELL_ATTR6_UNK15 = 0x00008000, // 15 not set in 3.0.3
|
||||||
|
|||||||
@@ -449,7 +449,7 @@ SpellValue::SpellValue(SpellInfo const* proto)
|
|||||||
AuraStackAmount = 1;
|
AuraStackAmount = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Spell::Spell(Unit* Caster, SpellInfo const *info, bool triggered, uint64 originalCasterGUID, bool skipCheck, bool castedClientside):
|
Spell::Spell(Unit* Caster, SpellInfo const *info, bool triggered, uint64 originalCasterGUID, bool skipCheck):
|
||||||
m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, Caster)),
|
m_spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(info, Caster)),
|
||||||
m_caster(Caster), m_spellValue(new SpellValue(m_spellInfo))
|
m_caster(Caster), m_spellValue(new SpellValue(m_spellInfo))
|
||||||
{
|
{
|
||||||
@@ -4180,7 +4180,7 @@ void Spell::SendChannelStart(uint32 duration)
|
|||||||
{
|
{
|
||||||
WorldObject* target = NULL;
|
WorldObject* target = NULL;
|
||||||
|
|
||||||
// select first not resisted target from target list for _0_ effect
|
// select first not resisted target from target list for first available effect
|
||||||
if (!m_UniqueTargetInfo.empty())
|
if (!m_UniqueTargetInfo.empty())
|
||||||
{
|
{
|
||||||
for (std::list<TargetInfo>::const_iterator itr = m_UniqueTargetInfo.begin(); itr != m_UniqueTargetInfo.end(); ++itr)
|
for (std::list<TargetInfo>::const_iterator itr = m_UniqueTargetInfo.begin(); itr != m_UniqueTargetInfo.end(); ++itr)
|
||||||
@@ -4722,6 +4722,33 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||||||
return SPELL_FAILED_MOVING;
|
return SPELL_FAILED_MOVING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Vehicle* vehicle = m_caster->GetVehicle())
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
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)
|
||||||
|
return SPELL_FAILED_DONT_REPORT;
|
||||||
|
}
|
||||||
|
|
||||||
Unit* target = m_targets.GetUnitTarget();
|
Unit* target = m_targets.GetUnitTarget();
|
||||||
// In pure self-cast spells, the client won't send any unit target
|
// In pure self-cast spells, the client won't send any unit target
|
||||||
if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_ALLY)) // TARGET_FLAG_SELF == 0, remember!
|
if (!target && (m_targets.GetTargetMask() == TARGET_FLAG_SELF || m_targets.GetTargetMask() & TARGET_FLAG_UNIT_ALLY)) // TARGET_FLAG_SELF == 0, remember!
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ class Spell
|
|||||||
|
|
||||||
typedef std::set<Aura*> UsedSpellMods;
|
typedef std::set<Aura*> UsedSpellMods;
|
||||||
|
|
||||||
Spell(Unit* Caster, SpellInfo const *info, bool triggered, uint64 originalCasterGUID = 0, bool skipCheck = false, bool castedClientside = false);
|
Spell(Unit* Caster, SpellInfo const *info, bool triggered, uint64 originalCasterGUID = 0, bool skipCheck = false);
|
||||||
~Spell();
|
~Spell();
|
||||||
|
|
||||||
void prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura = NULL);
|
void prepare(SpellCastTargets const* targets, AuraEffect const* triggeredByAura = NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user