diff options
author | Shauren <shauren.trinity@gmail.com> | 2013-06-29 15:20:15 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2013-06-29 15:20:15 +0200 |
commit | 13208ff25706bf23b428a67452d1b5fa26c7ceec (patch) | |
tree | b270e99a7ee9076e572019fd655c6d765c1a987b /src | |
parent | 44c844d6fd69013d072b40b6cdb526bb3e6b012c (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.cpp | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 6 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 3 | ||||
-rwxr-xr-x | src/server/game/Entities/Vehicle/Vehicle.cpp | 40 | ||||
-rw-r--r-- | src/server/game/Entities/Vehicle/VehicleDefines.h | 22 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp | 6 |
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; } } |