Core/Housing: harden isolated DB2 record-size validation
This commit is contained in:
@@ -8,7 +8,6 @@
|
||||
#include "DB2Store.h"
|
||||
#include "HotfixDatabase.h"
|
||||
#include "Log.h"
|
||||
#include "SharedDefines.h"
|
||||
#include "World.h"
|
||||
|
||||
#include <mutex>
|
||||
@@ -20,7 +19,9 @@ namespace Housing::ClientData
|
||||
{
|
||||
namespace
|
||||
{
|
||||
constexpr uint32 HouseRoomFileDataId69587 = 5163003;
|
||||
constexpr uint32 HouseRoomLayoutHash69587 = 0xF04DC279;
|
||||
constexpr uint32 HouseLevelDataFileDataId69587 = 7149539;
|
||||
constexpr uint32 HouseLevelDataLayoutHash69587 = 0xF8146F9D;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
@@ -78,7 +79,7 @@ namespace Housing::ClientData
|
||||
constexpr DB2LoadInfo HouseRoomLoadInfo69587
|
||||
{
|
||||
HouseRoomFields69587,
|
||||
std::size(HouseRoomFields69587),
|
||||
10,
|
||||
&HouseRoomMeta::Instance,
|
||||
HOTFIX_SEL_HOUSE_ROOM
|
||||
};
|
||||
@@ -86,7 +87,7 @@ namespace Housing::ClientData
|
||||
constexpr DB2LoadInfo HouseLevelDataLoadInfo69587
|
||||
{
|
||||
HouseLevelDataFields69587,
|
||||
std::size(HouseLevelDataFields69587),
|
||||
4,
|
||||
&HouseLevelDataMeta::Instance,
|
||||
HOTFIX_SEL_HOUSE_LEVEL_DATA
|
||||
};
|
||||
@@ -140,6 +141,33 @@ namespace Housing::ClientData
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HasExpectedGeneratedMetadata()
|
||||
{
|
||||
bool const roomMetaValid =
|
||||
HouseRoomMeta::Instance.FileDataId == HouseRoomFileDataId69587 &&
|
||||
HouseRoomMeta::Instance.LayoutHash == HouseRoomLayoutHash69587 &&
|
||||
HouseRoomMeta::Instance.FieldCount == 10 &&
|
||||
HouseRoomMeta::Instance.FileFieldCount == 10 &&
|
||||
HouseRoomMeta::Instance.GetRecordSize() == sizeof(HouseRoomRecord69587);
|
||||
|
||||
bool const levelMetaValid =
|
||||
HouseLevelDataMeta::Instance.FileDataId == HouseLevelDataFileDataId69587 &&
|
||||
HouseLevelDataMeta::Instance.LayoutHash == HouseLevelDataLayoutHash69587 &&
|
||||
HouseLevelDataMeta::Instance.FieldCount == 4 &&
|
||||
HouseLevelDataMeta::Instance.FileFieldCount == 4 &&
|
||||
HouseLevelDataMeta::Instance.GetRecordSize() == sizeof(HouseLevelDataRecord69587);
|
||||
|
||||
if (!roomMetaValid || !levelMetaValid)
|
||||
{
|
||||
TC_LOG_ERROR("housing",
|
||||
"Housing 69587 client-data metadata guard failed (HouseRoom={}, HouseLevelData={}); room templates remain disabled",
|
||||
roomMetaValid, levelMetaValid);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void EnsureLoaded()
|
||||
{
|
||||
HousingClientDataStores& stores = GetStores();
|
||||
@@ -149,7 +177,16 @@ namespace Housing::ClientData
|
||||
|
||||
stores.LoadAttempted = true;
|
||||
|
||||
if (!HasExpectedGeneratedMetadata())
|
||||
return;
|
||||
|
||||
LocaleConstant const locale = sWorld->GetDefaultDbcLocale();
|
||||
if (!IsValidLocale(locale))
|
||||
{
|
||||
TC_LOG_ERROR("housing", "Housing client-data cannot load with invalid DBC locale {}", uint32(locale));
|
||||
return;
|
||||
}
|
||||
|
||||
std::string const path = sWorld->GetDataPath() + "dbc/" + localeNames[locale] + '/';
|
||||
|
||||
stores.RoomReady = LoadVerifiedStore(stores.RoomStore, path, locale, HouseRoomLayoutHash69587);
|
||||
|
||||
Reference in New Issue
Block a user