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:
1 parent
44c844d6fd
commit
13208ff257
9 files changed
+53
-36
No files matched your search
@@ -328,7 +328,7 @@ void VehicleAI::CheckConditions(const uint32 diff)
|
|||||||
if (!conditions.empty())
|
if (!conditions.empty())
|
||||||
{
|
{
|
||||||
for (SeatMap::iterator itr = m_vehicle->Seats.begin(); itr != m_vehicle->Seats.end(); ++itr)
|
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())
|
if (Player* player = passenger->ToPlayer())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -475,7 +475,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
|||||||
if (IsUnit(*itr))
|
if (IsUnit(*itr))
|
||||||
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
|
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
|
||||||
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
|
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);
|
player->AreaExploredOrEventHappens(e.action.quest.quest);
|
||||||
|
|
||||||
if (IsPlayer(*itr))
|
if (IsPlayer(*itr))
|
||||||
@@ -783,7 +783,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
|||||||
// Special handling for vehicles
|
// Special handling for vehicles
|
||||||
if (Vehicle* vehicle = unit->GetVehicleKit())
|
if (Vehicle* vehicle = unit->GetVehicleKit())
|
||||||
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
|
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());
|
player->GroupEventHappens(e.action.quest.quest, GetBaseObject());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -915,7 +915,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
|||||||
if (IsUnit(*itr))
|
if (IsUnit(*itr))
|
||||||
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
|
if (Vehicle* vehicle = (*itr)->ToUnit()->GetVehicleKit())
|
||||||
for (SeatMap::iterator it = vehicle->Seats.begin(); it != vehicle->Seats.end(); ++it)
|
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);
|
player->RewardPlayerAndGroupAtEvent(e.action.killedMonster.creature, player);
|
||||||
|
|
||||||
if (!IsPlayer(*itr))
|
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_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_VOLUNTARY_EXIT = 0x00040000,
|
||||||
VEHICLE_SEAT_FLAG_HAS_VEH_EXIT_ANIM_FORCED_EXIT = 0x00080000,
|
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_UNK22 = 0x00200000,
|
||||||
VEHICLE_SEAT_FLAG_REC_HAS_VEHICLE_ENTER_ANIM = 0x00400000,
|
VEHICLE_SEAT_FLAG_REC_HAS_VEHICLE_ENTER_ANIM = 0x00400000,
|
||||||
VEHICLE_SEAT_FLAG_IS_USING_VEHICLE_CONTROLS = 0x00800000, // Lua_IsUsingVehicleControls
|
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));
|
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.
|
// 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;
|
return;
|
||||||
|
|
||||||
AuraEffect* rideVehicleEffect = NULL;
|
AuraEffect* rideVehicleEffect = NULL;
|
||||||
@@ -17261,7 +17261,7 @@ void Unit::OutDebugInfo() const
|
|||||||
{
|
{
|
||||||
o << "Passenger List: ";
|
o << "Passenger List: ";
|
||||||
for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
|
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() << ", ";
|
o << passenger->GetGUID() << ", ";
|
||||||
TC_LOG_INFO(LOG_FILTER_UNITS, "%s", o.str().c_str());
|
TC_LOG_INFO(LOG_FILTER_UNITS, "%s", o.str().c_str());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -505,7 +505,6 @@ enum UnitState
|
|||||||
UNIT_STATE_POSSESSED = 0x00010000,
|
UNIT_STATE_POSSESSED = 0x00010000,
|
||||||
UNIT_STATE_CHARGING = 0x00020000,
|
UNIT_STATE_CHARGING = 0x00020000,
|
||||||
UNIT_STATE_JUMPING = 0x00040000,
|
UNIT_STATE_JUMPING = 0x00040000,
|
||||||
UNIT_STATE_ONVEHICLE = 0x00080000,
|
|
||||||
UNIT_STATE_MOVE = 0x00100000,
|
UNIT_STATE_MOVE = 0x00100000,
|
||||||
UNIT_STATE_ROTATING = 0x00200000,
|
UNIT_STATE_ROTATING = 0x00200000,
|
||||||
UNIT_STATE_EVADE = 0x00400000,
|
UNIT_STATE_EVADE = 0x00400000,
|
||||||
@@ -515,7 +514,7 @@ enum UnitState
|
|||||||
UNIT_STATE_CHASE_MOVE = 0x04000000,
|
UNIT_STATE_CHASE_MOVE = 0x04000000,
|
||||||
UNIT_STATE_FOLLOW_MOVE = 0x08000000,
|
UNIT_STATE_FOLLOW_MOVE = 0x08000000,
|
||||||
UNIT_STATE_IGNORE_PATHFINDING = 0x10000000, // do not use pathfinding in any MovementGenerator
|
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)
|
// 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_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),
|
UNIT_STATE_CONTROLLED = (UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING),
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ Vehicle::~Vehicle()
|
|||||||
/// @Uninstall must be called before this.
|
/// @Uninstall must be called before this.
|
||||||
ASSERT(_status == STATUS_UNINSTALLING);
|
ASSERT(_status == STATUS_UNINSTALLING);
|
||||||
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
|
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);
|
SeatMap::const_iterator seat = Seats.find(seatId);
|
||||||
if (seat == Seats.end())
|
if (seat == Seats.end())
|
||||||
return false;
|
return false;
|
||||||
return !seat->second.Passenger;
|
return seat->second.IsEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -321,7 +321,7 @@ Unit* Vehicle::GetPassenger(int8 seatId) const
|
|||||||
if (seat == Seats.end())
|
if (seat == Seats.end())
|
||||||
return NULL;
|
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())
|
if (seat == Seats.end())
|
||||||
return seat;
|
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)
|
if (next)
|
||||||
{
|
{
|
||||||
@@ -449,7 +449,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
|
|||||||
if (seatId < 0) // no specific seat requirement
|
if (seatId < 0) // no specific seat requirement
|
||||||
{
|
{
|
||||||
for (seat = Seats.begin(); seat != Seats.end(); ++seat)
|
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;
|
break;
|
||||||
|
|
||||||
if (seat == Seats.end()) // no available seat
|
if (seat == Seats.end()) // no available seat
|
||||||
@@ -472,14 +472,14 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
|
|||||||
|
|
||||||
e->Seat = seat;
|
e->Seat = seat;
|
||||||
_pendingJoinEvents.push_back(e);
|
_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);
|
ASSERT(passenger);
|
||||||
passenger->ExitVehicle();
|
passenger->ExitVehicle();
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(!seat->second.Passenger);
|
ASSERT(seat->second.IsEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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",
|
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);
|
unit->GetName().c_str(), _me->GetEntry(), _vehicleInfo->m_ID, _me->GetGUIDLow(), (int32)seat->first);
|
||||||
|
|
||||||
seat->second.Passenger = 0;
|
|
||||||
if (seat->second.SeatInfo->CanEnterOrExit() && ++UsableSeatNum)
|
if (seat->second.SeatInfo->CanEnterOrExit() && ++UsableSeatNum)
|
||||||
_me->SetFlag(UNIT_NPC_FLAGS, (_me->GetTypeId() == TYPEID_PLAYER ? UNIT_NPC_FLAG_PLAYER_VEHICLE : UNIT_NPC_FLAG_SPELLCLICK));
|
_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)
|
if (_me->GetTypeId() == TYPEID_UNIT && unit->GetTypeId() == TYPEID_PLAYER && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
|
||||||
_me->RemoveCharmedBy(unit);
|
_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
|
// 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)
|
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());
|
ASSERT(passenger->IsInWorld());
|
||||||
|
|
||||||
@@ -578,7 +581,7 @@ void Vehicle::RelocatePassengers()
|
|||||||
bool Vehicle::IsVehicleInUse() const
|
bool Vehicle::IsVehicleInUse() const
|
||||||
{
|
{
|
||||||
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
|
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
|
||||||
if (itr->second.Passenger)
|
if (!itr->second.IsEmpty())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -625,7 +628,7 @@ void Vehicle::InitMovementInfoForBase()
|
|||||||
VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit const* passenger) const
|
VehicleSeatEntry const* Vehicle::GetSeatForPassenger(Unit const* passenger) const
|
||||||
{
|
{
|
||||||
for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); ++itr)
|
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 itr->second.SeatInfo;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -648,7 +651,7 @@ SeatMap::iterator Vehicle::GetSeatIteratorForPassenger(Unit* passenger)
|
|||||||
{
|
{
|
||||||
SeatMap::iterator itr;
|
SeatMap::iterator itr;
|
||||||
for (itr = Seats.begin(); itr != Seats.end(); ++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 itr;
|
||||||
|
|
||||||
return Seats.end();
|
return Seats.end();
|
||||||
@@ -670,7 +673,7 @@ uint8 Vehicle::GetAvailableSeatCount() const
|
|||||||
uint8 ret = 0;
|
uint8 ret = 0;
|
||||||
SeatMap::const_iterator itr;
|
SeatMap::const_iterator itr;
|
||||||
for (itr = Seats.begin(); itr != Seats.end(); ++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;
|
++ret;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -806,7 +809,8 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
|
|||||||
Target->RemovePendingEventsForPassenger(Passenger);
|
Target->RemovePendingEventsForPassenger(Passenger);
|
||||||
|
|
||||||
Passenger->SetVehicle(Target);
|
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())
|
if (Seat->second.SeatInfo->CanEnterOrExit())
|
||||||
{
|
{
|
||||||
ASSERT(Target->UsableSeatNum);
|
ASSERT(Target->UsableSeatNum);
|
||||||
@@ -836,8 +840,8 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
|
|||||||
player->UnsummonPetTemporaryIfAny();
|
player->UnsummonPetTemporaryIfAny();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_HIDE_PASSENGER)
|
if (Seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)
|
||||||
Passenger->AddUnitState(UNIT_STATE_ONVEHICLE);
|
Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||||
|
|
||||||
Passenger->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
|
Passenger->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
|
||||||
VehicleSeatEntry const* veSeat = Seat->second.SeatInfo;
|
VehicleSeatEntry const* veSeat = Seat->second.SeatInfo;
|
||||||
|
|||||||
@@ -53,11 +53,29 @@ enum VehicleSpells
|
|||||||
VEHICLE_SPELL_PARACHUTE = 45472
|
VEHICLE_SPELL_PARACHUTE = 45472
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PassengerInfo
|
||||||
|
{
|
||||||
|
uint64 Guid;
|
||||||
|
bool IsUnselectable;
|
||||||
|
|
||||||
|
void Reset()
|
||||||
|
{
|
||||||
|
Guid = 0;
|
||||||
|
IsUnselectable = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct VehicleSeat
|
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;
|
VehicleSeatEntry const* SeatInfo;
|
||||||
uint64 Passenger;
|
PassengerInfo Passenger;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VehicleAccessory
|
struct VehicleAccessory
|
||||||
|
|||||||
@@ -467,10 +467,6 @@ class npc_bone_spike : public CreatureScript
|
|||||||
init.DisableTransportPathTransformations();
|
init.DisableTransportPathTransformations();
|
||||||
init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
|
init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
|
||||||
init.Launch();
|
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)
|
void UpdateAI(uint32 diff)
|
||||||
|
|||||||
@@ -1632,7 +1632,7 @@ class FlameLeviathanPursuedTargetSelector
|
|||||||
//! Vehicle must be in use by player
|
//! Vehicle must be in use by player
|
||||||
bool playerFound = false;
|
bool playerFound = false;
|
||||||
for (SeatMap::const_iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end() && !playerFound; ++itr)
|
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;
|
playerFound = true;
|
||||||
|
|
||||||
return !playerFound;
|
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)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user