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
This commit is contained in:
Ovahlord
2019-01-18 07:18:28 +01:00
parent 771f21a171
commit 0373b3b613
6 changed files with 77 additions and 35 deletions

View File

@@ -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);

View File

@@ -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
{

View File

@@ -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;

View File

@@ -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();

View File

@@ -559,6 +559,7 @@ typedef std::unordered_map<uint32, QuestLocale> QuestLocaleContainer;
typedef std::unordered_map<uint32, NpcTextLocale> NpcTextLocaleContainer;
typedef std::unordered_map<uint32, PageTextLocale> PageTextLocaleContainer;
typedef std::unordered_map<uint32, uint8> TaxiNodeLevelDataContainer;
typedef std::unordered_map<uint32, float> 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<uint32> _difficultyEntries[MAX_DIFFICULTY - 1]; // already loaded difficulty 1 value in creatures, used in CheckCreatureTemplate
std::set<uint32> _hasDifficultyEntries[MAX_DIFFICULTY - 1]; // already loaded creatures with difficulty 1 values, used in CheckCreatureTemplate

View File

@@ -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();