From 0373b3b613e13800aa87f2d0771cbc4def5730a5 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Fri, 18 Jan 2019 07:18:28 +0100 Subject: [PATCH] Core/Vehicles: implement vehicle seat addon table to allow us to specify orientation values for vehicle seat attachment coordinates. * added seat template addon data for Ozumat in Throne of the Tides --- .../custom/custom_2019_01_18_00_world.sql | 14 ++++++ src/server/game/DataStores/DBCEnums.h | 31 ------------ src/server/game/Entities/Vehicle/Vehicle.cpp | 5 +- src/server/game/Globals/ObjectMgr.cpp | 47 +++++++++++++++++++ src/server/game/Globals/ObjectMgr.h | 12 +++++ src/server/game/World/World.cpp | 3 ++ 6 files changed, 77 insertions(+), 35 deletions(-) create mode 100644 sql/updates/world/custom/custom_2019_01_18_00_world.sql diff --git a/sql/updates/world/custom/custom_2019_01_18_00_world.sql b/sql/updates/world/custom/custom_2019_01_18_00_world.sql new file mode 100644 index 00000000000..00dad8f216e --- /dev/null +++ b/sql/updates/world/custom/custom_2019_01_18_00_world.sql @@ -0,0 +1,14 @@ +DROP TABLE IF EXISTS `vehicle_seat_addon`; +CREATE TABLE `vehicle_seat_addon`( + `SeatID` MEDIUMINT(8) UNSIGNED NOT NULL COMMENT 'VehicleSeat.dbc identifier', + `Angle` FLOAT UNSIGNED NOT NULL COMMENT 'Seat angle override field', + PRIMARY KEY (`SeatID`) +); + +DELETE FROM `vehicle_seat_addon` WHERE `SeatID` IN (8372, 8450, 8451, 8453, 8426); +INSERT INTO `vehicle_seat_addon` (`SeatID`, `Angle`) VALUES +(8372, 180), +(8426, 180), +(8450, 180), +(8451, 180), +(8453, 180); diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 750bbd5cacd..a5b92d7cdd6 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -647,37 +647,6 @@ enum VehicleSeatFlagsB VEHICLE_SEAT_FLAG_B_VEHICLE_PLAYERFRAME_UI = 0x80000000 // Lua_UnitHasVehiclePlayerFrameUI - actually checked for flagsb &~ 0x80000000 }; -enum VehicleAttachmentIds -{ - VEHICLE_ATTACHMENT_ID_UNK0 = -1, - VEHICLE_ATTACHMENT_ID_UNK1 = 0, - VEHICLE_ATTACHMENT_ID_UNK2 = 1, - VEHICLE_ATTACHMENT_ID_INVERT_SEAT_ANGLE_1 = 2, - VEHICLE_ATTACHMENT_ID_UNK3 = 3, - VEHICLE_ATTACHMENT_ID_UNK4 = 4, - VEHICLE_ATTACHMENT_ID_UNK5 = 5, - VEHICLE_ATTACHMENT_ID_UNK6 = 6, - VEHICLE_ATTACHMENT_ID_UNK7 = 7, - VEHICLE_ATTACHMENT_ID_UNK8 = 8, - VEHICLE_ATTACHMENT_ID_UNK9 = 9, - VEHICLE_ATTACHMENT_ID_UNK10 = 10, - VEHICLE_ATTACHMENT_ID_UNK11 = 11, - VEHICLE_ATTACHMENT_ID_UNK12 = 12, - VEHICLE_ATTACHMENT_ID_UNK13 = 13, - VEHICLE_ATTACHMENT_ID_UNK14 = 14, - VEHICLE_ATTACHMENT_ID_UNK15 = 15, - VEHICLE_ATTACHMENT_ID_INVERT_SEAT_ANGLE_2 = 16, - VEHICLE_ATTACHMENT_ID_UNK16 = 17, - VEHICLE_ATTACHMENT_ID_UNK17 = 18, - VEHICLE_ATTACHMENT_ID_UNK18 = 19, - VEHICLE_ATTACHMENT_ID_UNK19 = 20, - VEHICLE_ATTACHMENT_ID_UNK20 = 21, - VEHICLE_ATTACHMENT_ID_UNK21 = 22, - VEHICLE_ATTACHMENT_ID_UNK22 = 23, - VEHICLE_ATTACHMENT_ID_UNK23 = 24, - VEHICLE_ATTACHMENT_ID_UNK24 = 25 -}; - // CurrencyTypes.dbc enum CurrencyTypes { diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp index af03b391091..5d43c00ad0a 100644 --- a/src/server/game/Entities/Vehicle/Vehicle.cpp +++ b/src/server/game/Entities/Vehicle/Vehicle.cpp @@ -879,10 +879,7 @@ 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 = 0.0f; - if ((veSeat->m_attachmentID == VEHICLE_ATTACHMENT_ID_INVERT_SEAT_ANGLE_1 || veSeat->m_attachmentID == VEHICLE_ATTACHMENT_ID_INVERT_SEAT_ANGLE_2) - && veSeat->HasFlag(VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4)) // This flag is common in all vehicles that use inverted orientation in combination with the attachment IDs - o += float(M_PI); + float o = sObjectMgr->GetVehicleSeatOrientationOffset(veSeat->m_ID); float x = veSeat->m_attachmentOffsetX; float y = veSeat->m_attachmentOffsetY; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2f096e33afe..1df68dcf2a4 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3422,6 +3422,53 @@ 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 + QueryResult result = WorldDatabase.Query("SELECT `SeatID`, `Angle` 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(M_PI) / 180; + + 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). Setting to 0.", seatID, fields[1].GetFloat()); + orientation = 0.0f; + continue; + } + + _vehicleSeatAddonStore.emplace(seatID, orientation); + + ++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 7a94c0c0e1f..45f0acdef85 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -559,6 +559,7 @@ typedef std::unordered_map QuestLocaleContainer; typedef std::unordered_map NpcTextLocaleContainer; typedef std::unordered_map PageTextLocaleContainer; typedef std::unordered_map TaxiNodeLevelDataContainer; +typedef std::unordered_map VehicleSeatAddonContainer; struct GossipMenuItemsLocale { @@ -1171,6 +1172,7 @@ class TC_GAME_API ObjectMgr void LoadMailLevelRewards(); void LoadVehicleTemplateAccessories(); void LoadVehicleAccessories(); + void LoadVehicleSeatAddon(); void LoadGossipText(); @@ -1568,6 +1570,15 @@ class TC_GAME_API ObjectMgr uint32 GetGameObjectTypeByEntry(uint32 entry) const; + float GetVehicleSeatOrientationOffset(uint32 seatId) const + { + VehicleSeatAddonContainer::const_iterator itr = _vehicleSeatAddonStore.find(seatId); + if (itr != _vehicleSeatAddonStore.end()) + return itr->second; + + return 0.0f; + } + private: // first free id for selected id type uint32 _auctionId; @@ -1729,6 +1740,7 @@ class TC_GAME_API ObjectMgr GraveyardOrientationContainer _graveyardOrientations; TaxiNodeLevelDataContainer _taxiNodeLevelDataStore; + VehicleSeatAddonContainer _vehicleSeatAddonStore; std::set _difficultyEntries[MAX_DIFFICULTY - 1]; // already loaded difficulty 1 value in creatures, used in CheckCreatureTemplate std::set _hasDifficultyEntries[MAX_DIFFICULTY - 1]; // already loaded creatures with difficulty 1 values, used in CheckCreatureTemplate diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index e435d4bcd3c..ba17879c718 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1886,6 +1886,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();