aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp12
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp39
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h1
-rw-r--r--src/server/game/Entities/Vehicle/VehicleDefines.h26
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp56
-rw-r--r--src/server/game/Globals/ObjectMgr.h12
-rw-r--r--src/server/game/World/World.cpp3
-rw-r--r--src/server/scripts/World/npcs_special.cpp35
8 files changed, 142 insertions, 42 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 974806c39f1..333f2760a68 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -11871,6 +11871,7 @@ void Unit::_ExitVehicle(Position const* exitPosition)
return;
// This should be done before dismiss, because there may be some aura removal
+ VehicleSeatAddon const* seatAddon = m_vehicle->GetSeatAddonForSeatOfPassenger(this);
Vehicle* vehicle = m_vehicle->RemovePassenger(this);
Player* player = ToPlayer();
@@ -11895,7 +11896,18 @@ void Unit::_ExitVehicle(Position const* exitPosition)
// Set exit position to vehicle position and use the current orientation
pos = vehicle->GetBase()->GetPosition();
pos.SetOrientation(GetOrientation());
+
+ // To-do: snap this hook out of existance
sScriptMgr->ModifyVehiclePassengerExitPos(this, vehicle, pos);
+
+ // Change exit position based on seat entry addon data
+ if (seatAddon)
+ {
+ if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamOffset)
+ pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
+ else if (seatAddon->ExitParameter == VehicleExitParameters::VehicleExitParamDest)
+ pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
+ }
}
float height = pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight();
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index 7530f658879..3bd0f173090 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -41,7 +41,8 @@ UsableSeatNum(0), _me(unit), _vehicleInfo(vehInfo), _creatureEntry(creatureEntry
if (uint32 seatId = _vehicleInfo->SeatID[i])
if (VehicleSeatEntry const* veSeat = sVehicleSeatStore.LookupEntry(seatId))
{
- Seats.insert(std::make_pair(i, VehicleSeat(veSeat)));
+ VehicleSeatAddon const* addon = sObjectMgr->GetVehicleSeatAddon(seatId);
+ Seats.insert(std::make_pair(i, VehicleSeat(veSeat, addon)));
if (veSeat->CanEnterOrExit())
++UsableSeatNum;
}
@@ -340,6 +341,28 @@ SeatMap::const_iterator Vehicle::GetNextEmptySeat(int8 seatId, bool next) const
}
/**
+ * @fn VehicleSeatAddon const* Vehicle::GetSeatAddonForSeatOfPassenger(Unit const* passenger) const
+ *
+ * @brief Gets the vehicle seat addon data for the seat of a passenger
+ *
+ * @author Ovahlord
+ * @date 28-1-2020
+ *
+ * @param passenger Identifier for the current seat user
+ *
+ * @return The seat addon data for the currently used seat of a passenger
+ */
+
+VehicleSeatAddon const* Vehicle::GetSeatAddonForSeatOfPassenger(Unit const* passenger) const
+{
+ for (SeatMap::const_iterator itr = Seats.begin(); itr != Seats.end(); itr++)
+ if (!itr->second.IsEmpty() && itr->second.Passenger.Guid == passenger->GetGUID())
+ return itr->second.SeatAddon;
+
+ return nullptr;
+}
+
+/**
* @fn void Vehicle::InstallAccessory(uint32 entry, int8 seatId, bool minion, uint8 type,
* uint32 summonTime)
*
@@ -804,6 +827,7 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
Passenger->RemoveAurasByType(SPELL_AURA_MOUNTED);
VehicleSeatEntry const* veSeat = Seat->second.SeatInfo;
+ VehicleSeatAddon const* veSeatAddon = Seat->second.SeatAddon;
Player* player = Passenger->ToPlayer();
if (player)
@@ -822,10 +846,13 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
if (veSeat->HasFlag(VEHICLE_SEAT_FLAG_DISABLE_GRAVITY))
Passenger->SetDisableGravity(true);
- if (Seat->second.SeatInfo->HasFlag(VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE))
- Passenger->AddUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
- Passenger->m_movementInfo.transport.pos.Relocate(veSeat->AttachmentOffset.X, veSeat->AttachmentOffset.Y, veSeat->AttachmentOffset.Z);
+ float o = veSeatAddon ? veSeatAddon->SeatOrientationOffset : 0.f;
+ float x = veSeat->AttachmentOffset.X;
+ float y = veSeat->AttachmentOffset.Y;
+ float z = veSeat->AttachmentOffset.Z;
+
+ Passenger->m_movementInfo.transport.pos.Relocate(x, y, z, o);
Passenger->m_movementInfo.transport.time = 0;
Passenger->m_movementInfo.transport.seat = Seat->first;
Passenger->m_movementInfo.transport.guid = Target->GetBase()->GetGUID();
@@ -849,8 +876,8 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
Movement::MoveSplineInit init(Passenger);
init.DisableTransportPathTransformations();
- init.MoveTo(veSeat->AttachmentOffset.X, veSeat->AttachmentOffset.Y, veSeat->AttachmentOffset.Z, false, true);
- init.SetFacing(0.0f);
+ init.MoveTo(x, y, z, false, true);
+ init.SetFacing(o);
init.SetTransportEnter();
Passenger->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index 513ba6eb26e..8bb3cc8beaf 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -52,6 +52,7 @@ class TC_GAME_API Vehicle : public TransportBase
bool HasEmptySeat(int8 seatId) const;
Unit* GetPassenger(int8 seatId) const;
SeatMap::const_iterator GetNextEmptySeat(int8 seatId, bool next) const;
+ VehicleSeatAddon const* GetSeatAddonForSeatOfPassenger(Unit const* passenger) const;
uint8 GetAvailableSeatCount() const;
bool AddPassenger(Unit* passenger, int8 seatId = -1);
diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h
index a428de24ff4..4af0156ea8c 100644
--- a/src/server/game/Entities/Vehicle/VehicleDefines.h
+++ b/src/server/game/Entities/Vehicle/VehicleDefines.h
@@ -76,6 +76,14 @@ enum VehicleSpells
VEHICLE_SPELL_PARACHUTE = 45472
};
+enum class VehicleExitParameters
+{
+ VehicleExitParamNone = 0, // provided parameters will be ignored
+ VehicleExitParamOffset = 1, // provided parameters will be used as offset values
+ VehicleExitParamDest = 2, // provided parameters will be used as absolute destination
+ VehicleExitParamMax
+};
+
struct PassengerInfo
{
ObjectGuid Guid;
@@ -90,9 +98,24 @@ struct PassengerInfo
}
};
+struct VehicleSeatAddon
+{
+ VehicleSeatAddon() { }
+ VehicleSeatAddon(float orientatonOffset, float exitX, float exitY, float exitZ, float exitO, uint8 param) :
+ SeatOrientationOffset(orientatonOffset), ExitParameterX(exitX), ExitParameterY(exitY), ExitParameterZ(exitZ),
+ ExitParameterO(exitO), ExitParameter(VehicleExitParameters(param)) { }
+
+ float SeatOrientationOffset = 0.f;
+ float ExitParameterX = 0.f;
+ float ExitParameterY = 0.f;
+ float ExitParameterZ = 0.f;
+ float ExitParameterO = 0.f;
+ VehicleExitParameters ExitParameter = VehicleExitParameters::VehicleExitParamNone;
+};
+
struct VehicleSeat
{
- explicit VehicleSeat(VehicleSeatEntry const* seatInfo) : SeatInfo(seatInfo)
+ explicit VehicleSeat(VehicleSeatEntry const* seatInfo, VehicleSeatAddon const* seatAddon) : SeatInfo(seatInfo), SeatAddon(seatAddon)
{
Passenger.Reset();
}
@@ -100,6 +123,7 @@ struct VehicleSeat
bool IsEmpty() const { return Passenger.Guid.IsEmpty(); }
VehicleSeatEntry const* SeatInfo;
+ VehicleSeatAddon const* SeatAddon;
PassengerInfo Passenger;
};
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index f9e20a9a420..289437620e1 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3495,6 +3495,62 @@ void ObjectMgr::LoadVehicleAccessories()
TC_LOG_INFO("server.loading", ">> Loaded %u Vehicle Accessories in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
+void ObjectMgr::LoadVehicleSeatAddon()
+{
+ uint32 oldMSTime = getMSTime();
+
+ _vehicleSeatAddonStore.clear(); // needed for reload case
+
+ uint32 count = 0;
+
+ // 0 1 2 3 4 5 6
+ QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOrientation`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`");
+
+ if (!result)
+ {
+ TC_LOG_ERROR("server.loading", ">> Loaded 0 vehicle seat addons. DB table `vehicle_seat_addon` is empty.");
+ return;
+ }
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 seatID = fields[0].GetUInt32();
+ float orientation = fields[1].GetFloat();
+ float exitX = fields[2].GetFloat();
+ float exitY = fields[3].GetFloat();
+ float exitZ = fields[4].GetFloat();
+ float exitO = fields[5].GetFloat();
+ uint8 exitParam = fields[6].GetUInt8();
+
+ if (!sVehicleSeatStore.LookupEntry(seatID))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: %u does not exist in VehicleSeat.dbc. Skipping entry.", seatID);
+ continue;
+ }
+
+ // Sanitizing values
+ if (orientation > float(M_PI * 2))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: %u is using invalid angle offset value (%f). Set Value to 0.", seatID, orientation);
+ orientation = 0.0f;
+ }
+
+ if (exitParam >= AsUnderlyingType(VehicleExitParameters::VehicleExitParamMax))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: %u is using invalid exit parameter value (%u). Setting to 0 (none).", seatID, exitParam);
+ continue;
+ }
+
+ _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(orientation, exitX, exitY, exitZ, exitO, exitParam);
+
+ ++count;
+ } while (result->NextRow());
+
+ TC_LOG_INFO("server.loading", ">> Loaded %u Vehicle Seat Addon entries in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+}
+
void ObjectMgr::LoadPetLevelInfo()
{
uint32 oldMSTime = getMSTime();
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 0002cea5292..54a97fa6bbe 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -521,6 +521,7 @@ typedef std::unordered_map<uint32, QuestObjectivesLocale> QuestObjectivesLocaleC
typedef std::unordered_map<uint32, QuestOfferRewardLocale> QuestOfferRewardLocaleContainer;
typedef std::unordered_map<uint32, QuestRequestItemsLocale> QuestRequestItemsLocaleContainer;
typedef std::unordered_map<uint32, PageTextLocale> PageTextLocaleContainer;
+typedef std::unordered_map<uint32, VehicleSeatAddon> VehicleSeatAddonContainer;
struct GossipMenuItemsLocale
{
@@ -1334,6 +1335,7 @@ class TC_GAME_API ObjectMgr
void LoadVehicleTemplateAccessories();
void LoadVehicleTemplate();
void LoadVehicleAccessories();
+ void LoadVehicleSeatAddon();
void LoadNPCText();
@@ -1690,6 +1692,15 @@ class TC_GAME_API ObjectMgr
bool IsTransportMap(uint32 mapId) const { return _transportMaps.count(mapId) != 0; }
+ VehicleSeatAddon const* GetVehicleSeatAddon(uint32 seatId) const
+ {
+ VehicleSeatAddonContainer::const_iterator itr = _vehicleSeatAddonStore.find(seatId);
+ if (itr == _vehicleSeatAddonStore.end())
+ return nullptr;
+
+ return &itr->second;
+ }
+
void LoadRaceAndClassExpansionRequirements();
void LoadRealmNames();
@@ -1906,6 +1917,7 @@ class TC_GAME_API ObjectMgr
PhaseNameContainer _phaseNameStore;
std::set<uint32> _transportMaps; // Helper container storing map ids that are for transports only, loaded from gameobject_template
+ VehicleSeatAddonContainer _vehicleSeatAddonStore;
};
#define sObjectMgr ObjectMgr::instance()
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index d99123ec6f2..b59776ed7b8 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -2028,6 +2028,9 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading Vehicle Accessories...");
sObjectMgr->LoadVehicleAccessories(); // must be after LoadCreatureTemplates() and LoadNPCSpellClickSpells()
+ TC_LOG_INFO("server.loading", "Loading Vehicle Seat Addon Data...");
+ sObjectMgr->LoadVehicleSeatAddon(); // must be after loading DBC
+
TC_LOG_INFO("server.loading", "Loading SpellArea Data..."); // must be after quest load
sSpellMgr->LoadSpellAreas();
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index 35a2cff69c5..dd1c4352062 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -2777,40 +2777,6 @@ public:
}
};
-enum TravelerTundraMammothNPCs
-{
- NPC_HAKMUD_OF_ARGUS = 32638,
- NPC_GNIMO = 32639,
- NPC_DRIX_BLACKWRENCH = 32641,
- NPC_MOJODISHU = 32642
-};
-
-class npc_traveler_tundra_mammoth_exit_pos : public UnitScript
-{
-public:
- npc_traveler_tundra_mammoth_exit_pos() : UnitScript("npc_traveler_tundra_mammoth_exit_pos") { }
-
- void ModifyVehiclePassengerExitPos(Unit* passenger, Vehicle* /*vehicle*/, Position& pos)
- {
- if (passenger->GetTypeId() == TYPEID_UNIT)
- {
- switch (passenger->GetEntry())
- {
- // Right side
- case NPC_DRIX_BLACKWRENCH:
- case NPC_GNIMO:
- pos.RelocateOffset({ -2.0f, -2.0f, 0.0f, 0.0f });
- break;
- // Left side
- case NPC_MOJODISHU:
- case NPC_HAKMUD_OF_ARGUS:
- pos.RelocateOffset({ -2.0f, 2.0f, 0.0f, 0.0f });
- break;
- }
- }
- }
-};
-
void AddSC_npcs_special()
{
new npc_air_force_bots();
@@ -2836,5 +2802,4 @@ void AddSC_npcs_special()
new npc_train_wrecker();
new npc_argent_squire_gruntling();
new npc_bountiful_table();
- new npc_traveler_tundra_mammoth_exit_pos();
}