mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-20 23:11:56 -04:00
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)
This commit is contained in:
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user