aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-05-06 16:45:03 +0200
committerShauren <shauren.trinity@gmail.com>2020-05-06 16:45:03 +0200
commit1fecbc6892b41bfe9d1e474d038c3b1f6e2dd125 (patch)
tree8ced7ad8c83db03c8bde2f1c887603973880b3b9
parent5fec9c1f5208c261c9c4ae6bee21bb5603876e01 (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
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp9
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h1
-rw-r--r--src/server/game/Spells/Spell.cpp2
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 f7ad49513af..84e94894c1c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -11366,7 +11366,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 4c333e65743..e3457dac50f 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -596,6 +596,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 b3d3650a787..29c28d8adce 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 fec0e81fc11..bb21d7c1a6c 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -7197,7 +7197,7 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo
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;