aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-06-29 15:20:15 +0200
committerShauren <shauren.trinity@gmail.com>2013-06-29 15:20:15 +0200
commit13208ff25706bf23b428a67452d1b5fa26c7ceec (patch)
treeb270e99a7ee9076e572019fd655c6d765c1a987b /src
parent44c844d6fd69013d072b40b6cdb526bb3e6b012c (diff)
Core/Vehicles: Implemented vehicle seat flag that makes passengers unselectable and dropped redundant UNIT_STATE_ONVEHICLE (it is only checked in the same places as unselectable unit flag)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CoreAI/CombatAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp6
-rw-r--r--src/server/game/DataStores/DBCEnums.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp40
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h22
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp6
9 files changed, 53 insertions, 36 deletions
diff --git a/src/server/game/AI/CoreAI/CombatAI.cpp b/src/server/game/AI/CoreAI/CombatAI.cpp
index 85dd9cca90c..85088bbeff4 100644
--- a/src/server/game/AI/CoreAI/CombatAI.cpp
+++ b/src/server/game/AI/CoreAI/CombatAI.cpp
@@ -328,7 +328,7 @@ void VehicleAI::CheckConditions(const uint32 diff)
if (!conditions.empty())
{
for (SeatMap::iterator itr = m_vehicle->Seats.begin(); itr != m_vehicle->Seats.end(); ++itr)
- if (Unit* passenger = ObjectAccessor::GetUnit(*m_vehicle->GetBase(), itr->second.Passenger))
+ if (Unit* passenger = ObjectAccessor::GetUnit(*m_vehicle->GetBase(), itr->second.Passenger.Guid))
{
if (Player* player = passenger->ToPlayer())
{
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 2abc526134c..86c246ff387 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -475,7 +475,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsUnit(*itr))
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger))
+ if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
player->AreaExploredOrEventHappens(e.action.quest.quest);
if (IsPlayer(*itr))
@@ -783,7 +783,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
// Special handling for vehicles
if (Vehicle* vehicle = unit->GetVehicleKit())
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger))
+ if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
player->GroupEventHappens(e.action.quest.quest, GetBaseObject());
break;
}
@@ -915,7 +915,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsUnit(*itr))
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
- if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger))
+ if (Player* player = ObjectAccessor::FindPlayer(it->second.Passenger.Guid))
player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
if (!IsPlayer(*itr))
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index c4283bbca8a..a7189ea415a 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -409,7 +409,7 @@ enum VehicleSeatFlags
VEHICLE_SEAT_FLAG_UNK18 = 0x00020000, // Needs research and support (28 vehicles): Allow entering vehicles while keeping specific permanent(?) auras that impose visuals (states like beeing under freeze/stun mechanic, emote state animations).
VEHICLE_SEAT_FLAG_HAS_VEH_EXIT_ANIM_VOLUNTARY_EXIT = 0x00040000,
VEHICLE_SEAT_FLAG_HAS_VEH_EXIT_ANIM_FORCED_EXIT = 0x00080000,
- VEHICLE_SEAT_FLAG_UNK21 = 0x00100000,
+ VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE = 0x00100000,
VEHICLE_SEAT_FLAG_UNK22 = 0x00200000,
VEHICLE_SEAT_FLAG_REC_HAS_VEHICLE_ENTER_ANIM = 0x00400000,
VEHICLE_SEAT_FLAG_IS_USING_VEHICLE_CONTROLS = 0x00800000, // Lua_IsUsingVehicleControls
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6fb3ef18462..021b86d4b51 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -16855,7 +16855,7 @@ void Unit::ChangeSeat(int8 seatId, bool next)
SeatMap::const_iterator seat = (seatId < 0 ? m_vehicle->GetNextEmptySeat(GetTransSeat(), next) : m_vehicle->Seats.find(seatId));
// The second part of the check will only return true if seatId >= 0. @Vehicle::GetNextEmptySeat makes sure of that.
- if (seat == m_vehicle->Seats.end() || seat->second.Passenger)
+ if (seat == m_vehicle->Seats.end() || !seat->second.IsEmpty())
return;
AuraEffect* rideVehicleEffect = NULL;
@@ -17261,7 +17261,7 @@ void Unit::OutDebugInfo() const
{
o << "Passenger List: ";
for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
- if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger))
+ if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
o << passenger->GetGUID() << ", ";
TC_LOG_INFO(LOG_FILTER_UNITS, "%s", o.str().c_str());
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 444d6460ced..5474e336498 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -505,7 +505,6 @@ enum UnitState
UNIT_STATE_POSSESSED = 0x00010000,
UNIT_STATE_CHARGING = 0x00020000,
UNIT_STATE_JUMPING = 0x00040000,
- UNIT_STATE_ONVEHICLE = 0x00080000,
UNIT_STATE_MOVE = 0x00100000,
UNIT_STATE_ROTATING = 0x00200000,
UNIT_STATE_EVADE = 0x00400000,
@@ -515,7 +514,7 @@ enum UnitState
UNIT_STATE_CHASE_MOVE = 0x04000000,
UNIT_STATE_FOLLOW_MOVE = 0x08000000,
UNIT_STATE_IGNORE_PATHFINDING = 0x10000000, // do not use pathfinding in any MovementGenerator
- UNIT_STATE_UNATTACKABLE = (UNIT_STATE_IN_FLIGHT | UNIT_STATE_ONVEHICLE),
+ UNIT_STATE_UNATTACKABLE = UNIT_STATE_IN_FLIGHT,
// for real move using movegen check and stop (except unstoppable flight)
UNIT_STATE_MOVING = UNIT_STATE_ROAMING_MOVE | UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE | UNIT_STATE_CHASE_MOVE | UNIT_STATE_FOLLOW_MOVE,
UNIT_STATE_CONTROLLED = (UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING),
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index c2eb526f3a3..88c9ab203b0 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -62,7 +62,7 @@ Vehicle::~Vehicle()
/// @Uninstall must be called before this.
ASSERT(_status == STATUS_UNINSTALLING);
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
- ASSERT(!itr->second.Passenger);
+ ASSERT(itr->second.IsEmpty());
}
/**
@@ -299,7 +299,7 @@ bool Vehicle::HasEmptySeat(int8 seatId) const
SeatMap::const_iterator seat = Seats.find(seatId);
if (seat == Seats.end())
return false;
- return !seat->second.Passenger;
+ return seat->second.IsEmpty();
}
/**
@@ -321,7 +321,7 @@ Unit* Vehicle::GetPassenger(int8 seatId) const
if (seat == Seats.end())
return NULL;
- return ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger);
+ return ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger.Guid);
}
/**
@@ -344,7 +344,7 @@ SeatMap::const_iterator Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
if (seat == Seats.end())
return seat;
- while (seat->second.Passenger || (!seat->second.SeatInfo->CanEnterOrExit() && !seat->second.SeatInfo->IsUsableByOverride()))
+ while (!seat->second.IsEmpty() || (!seat->second.SeatInfo->CanEnterOrExit() && !seat->second.SeatInfo->IsUsableByOverride()))
{
if (next)
{
@@ -449,7 +449,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
if (seatId < 0) // no specific seat requirement
{
for (seat = Seats.begin(); seat != Seats.end(); ++seat)
- if (!seat->second.Passenger && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride()))
+ if (seat->second.IsEmpty() && (seat->second.SeatInfo->CanEnterOrExit() || seat->second.SeatInfo->IsUsableByOverride()))
break;
if (seat == Seats.end()) // no available seat
@@ -472,14 +472,14 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
e->Seat = seat;
_pendingJoinEvents.push_back(e);
- if (seat->second.Passenger)
+ if (!seat->second.IsEmpty())
{
- Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger);
+ Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), seat->second.Passenger.Guid);
ASSERT(passenger);
passenger->ExitVehicle();
}
- ASSERT(!seat->second.Passenger);
+ ASSERT(seat->second.IsEmpty());
}
return true;
@@ -507,11 +507,14 @@ Vehicle* Vehicle::RemovePassenger(Unit* unit)
TC_LOG_DEBUG(LOG_FILTER_VEHICLES, "Unit %s exit vehicle entry %u id %u dbguid %u seat %d",
unit->GetName().c_str(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(), (int32)seat->first);
- seat->second.Passenger = 0;
if (seat->second.SeatInfo->CanEnterOrExit() && ++UsableSeatNum)
_me->SetFlag(UNIT_NPC_FLAGS, (_me->GetTypeId() == TYPEID_PLAYER ? UNIT_NPC_FLAG_PLAYER_VEHICLE : UNIT_NPC_FLAG_SPELLCLICK));
- unit->ClearUnitState(UNIT_STATE_ONVEHICLE);
+ // Remove UNIT_FLAG_NOT_SELECTABLE if passenger did not have it before entering vehicle
+ if (seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE && !seat->second.Passenger.IsUnselectable)
+ unit->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+
+ seat->second.Passenger.Reset();
if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
_me->RemoveCharmedBy(unit);
@@ -552,7 +555,7 @@ void Vehicle::RelocatePassengers()
// not sure that absolute position calculation is correct, it must depend on vehicle pitch angle
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
{
- if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.Passenger))
+ if (Unit* passenger = ObjectAccessor::GetUnit(*GetBase(), itr->second.Passenger.Guid))
{
ASSERT(passenger->IsInWorld());
@@ -578,7 +581,7 @@ void Vehicle::RelocatePassengers()
bool Vehicle::IsVehicleInUse() const
{
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
- if (itr->second.Passenger)
+ if (!itr->second.IsEmpty())
return true;
return false;
@@ -625,7 +628,7 @@ void Vehicle::InitMovementInfoForBase()
VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit const* passenger) const
{
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
- if (itr->second.Passenger == passenger->GetGUID())
+ if (itr->second.Passenger.Guid == passenger->GetGUID())
return itr->second.SeatInfo;
return NULL;
@@ -648,7 +651,7 @@ SeatMap::iterator Vehicle::GetSeatIteratorForPassenger(Unit* passenger)
{
SeatMap::iterator itr;
for (itr = Seats.begin(); itr != Seats.end(); ++itr)
- if (itr->second.Passenger == passenger->GetGUID())
+ if (itr->second.Passenger.Guid == passenger->GetGUID())
return itr;
return Seats.end();
@@ -670,7 +673,7 @@ uint8 Vehicle::GetAvailableSeatCount() const
uint8 ret = 0;
SeatMap::const_iterator itr;
for (itr = Seats.begin(); itr != Seats.end(); ++itr)
- if (!itr->second.Passenger && (itr->second.SeatInfo->CanEnterOrExit() || itr->second.SeatInfo->IsUsableByOverride()))
+ if (itr->second.IsEmpty() && (itr->second.SeatInfo->CanEnterOrExit() || itr->second.SeatInfo->IsUsableByOverride()))
++ret;
return ret;
@@ -806,7 +809,8 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
Target->RemovePendingEventsForPassenger(Passenger);
Passenger->SetVehicle(Target);
- Seat->second.Passenger = Passenger->GetGUID();
+ Seat->second.Passenger.Guid = Passenger->GetGUID();
+ Seat->second.Passenger.IsUnselectable = Passenger->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (Seat->second.SeatInfo->CanEnterOrExit())
{
ASSERT(Target->UsableSeatNum);
@@ -836,8 +840,8 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
player->UnsummonPetTemporaryIfAny();
}
- if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_HIDE_PASSENGER)
- Passenger->AddUnitState(UNIT_STATE_ONVEHICLE);
+ if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)
+ Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Passenger->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
VehicleSeatEntry const* veSeat = Seat->second.SeatInfo;
diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index dd73ab3a01b..ce922b550c1 100644
--- a/src/server/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
@@ -53,11 +53,29 @@ enum VehicleSpells
VEHICLE_SPELL_PARACHUTE = 45472
};
+struct PassengerInfo
+{
+ uint64 Guid;
+ bool IsUnselectable;
+
+ void Reset()
+ {
+ Guid = 0;
+ IsUnselectable = false;
+ }
+};
+
struct VehicleSeat
{
- explicit VehicleSeat(VehicleSeatEntry const* seatInfo) : SeatInfo(seatInfo), Passenger(0) {}
+ explicit VehicleSeat(VehicleSeatEntry const* seatInfo) : SeatInfo(seatInfo)
+ {
+ Passenger.Reset();
+ }
+
+ bool IsEmpty() const { return !Passenger.Guid; }
+
VehicleSeatEntry const* SeatInfo;
- uint64 Passenger;
+ PassengerInfo Passenger;
};
struct VehicleAccessory
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index 8fa4e030243..41892694055 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -467,10 +467,6 @@ class npc_bone_spike : public CreatureScript
init.DisableTransportPathTransformations();
init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
init.Launch();
-
- /// @WORKAROUND - Clear ON VEHICLE state to allow healing (Invalid target errors)
- /// Current rule for applying this state is questionable (seatFlags & VEHICLE_SEAT_FLAG_ALLOW_TURNING ???)
- passenger->ClearUnitState(UNIT_STATE_ONVEHICLE);
}
void UpdateAI(uint32 diff)
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 37ecf7874b8..a0ce73a9a55 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -1632,7 +1632,7 @@ class FlameLeviathanPursuedTargetSelector
//! Vehicle must be in use by player
bool playerFound = false;
for (SeatMap::const_iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end() && !playerFound; ++itr)
- if (IS_PLAYER_GUID(itr->second.Passenger))
+ if (IS_PLAYER_GUID(itr->second.Passenger.Guid))
playerFound = true;
return !playerFound;
@@ -1690,9 +1690,9 @@ class spell_pursue : public SpellScriptLoader
for (SeatMap::const_iterator itr = caster->GetVehicleKit()->Seats.begin(); itr != caster->GetVehicleKit()->Seats.end(); ++itr)
{
- if (IS_PLAYER_GUID(itr->second.Passenger))
+ if (IS_PLAYER_GUID(itr->second.Passenger.Guid))
{
- caster->AI()->Talk(EMOTE_PURSUE, itr->second.Passenger);
+ caster->AI()->Talk(EMOTE_PURSUE, itr->second.Passenger.Guid);
return;
}
}