diff --git a/sql/updates/world/4.3.4/2020_03_15_00_world.sql b/sql/updates/world/4.3.4/2020_03_15_00_world.sql new file mode 100644 index 0000000000..e3f966e7c2 --- /dev/null +++ b/sql/updates/world/4.3.4/2020_03_15_00_world.sql @@ -0,0 +1,5 @@ +ALTER TABLE `vehicle_seat_addon` + ADD COLUMN `SeatOffsetX` FLOAT DEFAULT 0 NULL AFTER `SeatEntry`, + ADD COLUMN `SeatOffsetY` FLOAT DEFAULT 0 NULL AFTER `SeatOffsetX`, + ADD COLUMN `SeatOffsetZ` FLOAT DEFAULT 0 NULL AFTER `SeatOffsetY`, + CHANGE `SeatOrientation` `SeatOffsetO` FLOAT DEFAULT 0 NULL COMMENT 'Seat Orientation override value'; diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index 61dea0e9f0..628f8be2f6 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -906,11 +906,20 @@ bool VehicleJoinEvent::Execute(uint64, uint32) if (veSeat->HasFlag(VEHICLE_SEAT_FLAG_PASSENGER_NOT_SELECTABLE)) Passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - float o = veSeatAddon ? veSeatAddon->SeatOrientationOffset : 0.f; + float o = 0.f; float x = veSeat->AttachmentOffset.X; float y = veSeat->AttachmentOffset.Y; float z = veSeat->AttachmentOffset.Z; + if (veSeatAddon) + { + // To-do: extract client m2 model bones and handle this part without db data + o += veSeatAddon->SeatOrientationOffset; + x += veSeatAddon->SeatXOffset; + y += veSeatAddon->SeatYOffset; + z += veSeatAddon->SeatZOffset; + } + Passenger->m_movementInfo.transport.pos.Relocate(x, y, z, o); Passenger->m_movementInfo.transport.time = 0; Passenger->m_movementInfo.transport.seat = Seat->first; diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index c087a9cbe8..2d00d5806b 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -100,10 +100,13 @@ 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)) { } + VehicleSeatAddon(float xOffset, float yOffset, float zOffset, float orientatonOffset, float exitX, float exitY, float exitZ, float exitO, uint8 param) : + SeatXOffset(xOffset), SeatYOffset(yOffset), SeatZOffset(zOffset), SeatOrientationOffset(orientatonOffset), + ExitParameterX(exitX), ExitParameterY(exitY), ExitParameterZ(exitZ), ExitParameterO(exitO), ExitParameter(VehicleExitParameters(param)) { } + float SeatXOffset = 0.f; + float SeatYOffset = 0.f; + float SeatZOffset = 0.f; float SeatOrientationOffset = 0.f; float ExitParameterX = 0.f; float ExitParameterY = 0.f; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6a716f15ae..f7d665315e 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3101,8 +3101,8 @@ void ObjectMgr::LoadVehicleSeatAddon() uint32 count = 0; - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOrientation`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`"); + // 0 1 2 3 4 5 6 7 8 9 + QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOffsetX`, `SeatOffsetY`, `SeatOffsetZ`, `SeatOffsetO`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`"); if (!result) { @@ -3115,12 +3115,15 @@ void ObjectMgr::LoadVehicleSeatAddon() 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(); + float seatX = fields[1].GetFloat(); + float seatY = fields[2].GetFloat(); + float seatZ = fields[3].GetFloat(); + float orientation = fields[4].GetFloat(); + float exitX = fields[5].GetFloat(); + float exitY = fields[6].GetFloat(); + float exitZ = fields[7].GetFloat(); + float exitO = fields[8].GetFloat(); + uint8 exitParam = fields[9].GetUInt8(); if (!sVehicleSeatStore.LookupEntry(seatID)) { @@ -3142,7 +3145,7 @@ void ObjectMgr::LoadVehicleSeatAddon() continue; } - _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(orientation, exitX, exitY, exitZ, exitO, exitParam); + _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(seatX, seatY, seatZ, orientation, exitX, exitY, exitZ, exitO, exitParam); ++count; }