diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-05-06 16:45:03 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-01-02 16:17:18 +0100 |
commit | d56d92fbe7436af00e00b00ca5e7640f852d3485 (patch) | |
tree | 02d53765ec1ca3d0742fafb7465e1690d8ba8f90 | |
parent | 0aa98a5bc9e6a8646179137f73d115178a815f11 (diff) |
Core/Units: Allow mind controlling non-controllable vehicles (for example players that become vehicle during boss encounters or creatures that only are vehicles to show non standard power type)
Closes #24562
(cherry picked from commit 1fecbc6892b41bfe9d1e474d038c3b1f6e2dd125)
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 2 |
4 files changed, 12 insertions, 2 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a603303bf5e..df25ae8b770 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10911,7 +10911,7 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au charmer->RemoveAurasByType(SPELL_AURA_MOUNTED); ASSERT(type != CHARM_TYPE_POSSESS || charmer->GetTypeId() == TYPEID_PLAYER); - ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle()); + ASSERT((type == CHARM_TYPE_VEHICLE) == (GetVehicleKit() && GetVehicleKit()->IsControllableVehicle())); TC_LOG_DEBUG("entities.unit", "SetCharmedBy: charmer %s, charmed %s, type %u.", charmer->GetGUID().ToString().c_str(), GetGUID().ToString().c_str(), uint32(type)); diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index dac2d725a89..33c7d7428ec 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -592,6 +592,15 @@ bool Vehicle::IsVehicleInUse() const return false; } +bool Vehicle::IsControllableVehicle() const +{ + for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr) + if (itr->second.SeatInfo->HasFlag(VEHICLE_SEAT_FLAG_CAN_CONTROL)) + return true; + + return false; +} + /** * @fn void Vehicle::InitMovementInfoForBase() * diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h index 8bb3cc8beaf..eb377a350e6 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.h +++ b/src/server/game/Entities/Vehicle/Vehicle.h @@ -61,6 +61,7 @@ class TC_GAME_API Vehicle : public TransportBase void RelocatePassengers(); void RemoveAllPassengers(); bool IsVehicleInUse() const; + bool IsControllableVehicle() const; void SetLastShootPos(Position const& pos) { _lastShootPos.Relocate(pos); } Position const& GetLastShootPos() const { return _lastShootPos; } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 5e0227891c8..c7bae4c17c8 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -7529,7 +7529,7 @@ bool Spell::CheckEffectTarget(Unit const* target, SpellEffectInfo const& spellEf case SPELL_AURA_MOD_CHARM: case SPELL_AURA_MOD_POSSESS_PET: case SPELL_AURA_AOE_CHARM: - if (target->GetTypeId() == TYPEID_UNIT && target->IsVehicle()) + if (target->GetVehicleKit() && target->GetVehicleKit()->IsControllableVehicle()) return false; if (target->IsMounted()) return false; |