diff --git a/src/common/DataStores/DB2FileLoader.cpp b/src/common/DataStores/DB2FileLoader.cpp
new file mode 100644
index 00000000000..6ec065aef27
--- /dev/null
+++ b/src/common/DataStores/DB2FileLoader.cpp
@@ -0,0 +1,1156 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#include "DB2FileLoader.h"
+#include "ByteConverter.h"
+#include "Common.h"
+#include "DB2Meta.h"
+#include "Errors.h"
+#include "Log.h"
+
+DB2FileLoadInfo::DB2FileLoadInfo() : Fields(nullptr), FieldCount(0), Meta(nullptr)
+{
+}
+
+DB2FileLoadInfo::DB2FileLoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta)
+ : Fields(fields), FieldCount(fieldCount), Meta(meta)
+{
+ TypesString.reserve(FieldCount);
+ for (std::size_t i = 0; i < FieldCount; ++i)
+ TypesString += char(Fields[i].Type);
+}
+
+uint32 DB2FileLoadInfo::GetStringFieldCount(bool localizedOnly) const
+{
+ uint32 stringFields = 0;
+ for (std::size_t i = 0; i < TypesString.length(); ++i)
+ if (TypesString[i] == FT_STRING || (TypesString[i] == FT_STRING_NOT_LOCALIZED && !localizedOnly))
+ ++stringFields;
+
+ return stringFields;
+}
+
+DB2FileSource::~DB2FileSource()
+{
+}
+
+class DB2FileLoaderImpl
+{
+public:
+ virtual ~DB2FileLoaderImpl() { }
+ virtual bool Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header) = 0;
+ virtual char* AutoProduceData(uint32& count, char**& indexTable, std::vector& stringPool) = 0;
+ virtual char* AutoProduceStrings(char* dataTable, uint32 locale) = 0;
+ virtual void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) = 0;
+ virtual DB2Record GetRecord(uint32 recordNumber) const = 0;
+ virtual DB2RecordCopy GetRecordCopy(uint32 copyNumber) const = 0;
+ virtual uint32 GetRecordCount() const = 0;
+ virtual uint32 GetRecordCopyCount() const = 0;
+ virtual uint32 GetMaxId() const = 0;
+
+private:
+ friend class DB2Record;
+ virtual unsigned char const* GetRawRecordData(uint32 recordNumber) const = 0;
+ virtual uint32 RecordGetId(unsigned char const* record, uint32 recordIndex) const = 0;
+ virtual uint8 RecordGetUInt8(unsigned char const* record, uint32 field, uint32 arrayIndex) const = 0;
+ virtual uint16 RecordGetUInt16(unsigned char const* record, uint32 field, uint32 arrayIndex) const = 0;
+ virtual uint32 RecordGetUInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const = 0;
+ virtual int32 RecordGetInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const = 0;
+ virtual float RecordGetFloat(unsigned char const* record, uint32 field, uint32 arrayIndex) const = 0;
+ virtual char const* RecordGetString(unsigned char const* record, uint32 field, uint32 arrayIndex) const = 0;
+ virtual std::size_t* RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const = 0;
+ virtual void RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const = 0;
+};
+
+class DB2FileLoaderRegularImpl final : public DB2FileLoaderImpl
+{
+public:
+ DB2FileLoaderRegularImpl();
+ ~DB2FileLoaderRegularImpl();
+
+ bool Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header) override;
+ char* AutoProduceData(uint32& count, char**& indexTable, std::vector& stringPool) override;
+ char* AutoProduceStrings(char* dataTable, uint32 locale) override;
+ void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) override;
+ DB2Record GetRecord(uint32 recordNumber) const override;
+ DB2RecordCopy GetRecordCopy(uint32 copyNumber) const override;
+ uint32 GetRecordCount() const override;
+ uint32 GetRecordCopyCount() const override;
+ uint32 GetMaxId() const override;
+
+private:
+ unsigned char const* GetRawRecordData(uint32 recordNumber) const override;
+ uint32 RecordGetId(unsigned char const* record, uint32 recordIndex) const override;
+ uint8 RecordGetUInt8(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ uint16 RecordGetUInt16(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ uint32 RecordGetUInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ int32 RecordGetInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ float RecordGetFloat(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ char const* RecordGetString(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ uint32 RecordGetVarInt(unsigned char const* record, uint32 field, uint32 arrayIndex, bool isSigned) const;
+ uint16 GetFieldOffset(uint32 field) const;
+ uint16 GetFieldSize(uint32 field) const;
+ std::size_t* RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const override;
+ void RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const override;
+
+#pragma pack(push, 1)
+ struct FieldEntry
+ {
+ uint16 UnusedBits;
+ uint16 Offset;
+ };
+#pragma pack(pop)
+
+ char const* fileName;
+ DB2FileLoadInfo const* _loadInfo;
+
+ DB2Header const* _header;
+
+ unsigned char* data;
+ unsigned char* stringTable;
+ unsigned char* idTable;
+ uint32 idTableSize;
+ DB2RecordCopy* copyTable;
+ FieldEntry* fields;
+};
+
+class DB2FileLoaderSparseImpl final : public DB2FileLoaderImpl
+{
+public:
+ DB2FileLoaderSparseImpl();
+ ~DB2FileLoaderSparseImpl();
+
+ bool Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header) override;
+ char* AutoProduceData(uint32& records, char**& indexTable, std::vector& stringPool) override;
+ char* AutoProduceStrings(char* dataTable, uint32 locale) override;
+ void AutoProduceRecordCopies(uint32 /*records*/, char** /*indexTable*/, char* /*dataTable*/) override { }
+ DB2Record GetRecord(uint32 recordNumber) const override;
+ DB2RecordCopy GetRecordCopy(uint32 copyNumber) const override;
+ uint32 GetRecordCount() const override;
+ uint32 GetRecordCopyCount() const override;
+ uint32 GetMaxId() const override;
+
+private:
+ unsigned char const* GetRawRecordData(uint32 recordNumber) const override;
+ uint32 RecordGetId(unsigned char const* record, uint32 recordIndex) const override;
+ uint8 RecordGetUInt8(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ uint16 RecordGetUInt16(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ uint32 RecordGetUInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ int32 RecordGetInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ float RecordGetFloat(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ char const* RecordGetString(unsigned char const* record, uint32 field, uint32 arrayIndex) const override;
+ uint32 RecordGetVarInt(unsigned char const* record, uint32 field, uint32 arrayIndex, bool isSigned) const;
+ uint16 GetFieldOffset(uint32 field, uint32 arrayIndex) const;
+ uint16 GetFieldSize(uint32 field) const;
+ std::size_t* RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const override;
+ void RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const override;
+ void CalculateAndStoreFieldOffsets(unsigned char const* rawRecord) const;
+
+#pragma pack(push, 1)
+ struct OffsetTableEntry
+ {
+ uint32 FileOffset;
+ uint16 RecordSize;
+ };
+ struct FieldEntry
+ {
+ uint16 UnusedBits;
+ uint16 Offset;
+ };
+#pragma pack(pop)
+
+ char const* fileName;
+ DB2FileLoadInfo const* _loadInfo;
+ std::size_t* _fieldAndArrayOffsets;
+
+ DB2Header const* _header;
+ FieldEntry* fields;
+
+ std::size_t dataStart;
+ unsigned char* data;
+ OffsetTableEntry* offsets;
+};
+
+DB2FileLoaderRegularImpl::DB2FileLoaderRegularImpl()
+{
+ fileName = nullptr;
+ _loadInfo = nullptr;
+ _header = nullptr;
+ data = nullptr;
+ stringTable = nullptr;
+ idTable = nullptr;
+ idTableSize = 0;
+ copyTable = nullptr;
+ fields = nullptr;
+}
+
+bool DB2FileLoaderRegularImpl::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header)
+{
+ _loadInfo = loadInfo;
+ _header = header;
+ ASSERT(_loadInfo->Meta->IndexField == -1 || _loadInfo->Meta->IndexField == int32(header->IndexField));
+
+ fileName = source->GetFileName();
+ fields = new FieldEntry[header->FieldCount];
+ if (!source->Read(fields, header->FieldCount * sizeof(FieldEntry)))
+ return false;
+
+ if (!_loadInfo->Meta->HasIndexFieldInData())
+ idTableSize = header->RecordCount * sizeof(uint32);
+
+ data = new unsigned char[header->RecordSize * header->RecordCount + header->StringTableSize];
+ stringTable = data + header->RecordSize * header->RecordCount;
+
+ if (!source->Read(data, header->RecordSize * header->RecordCount + header->StringTableSize))
+ return false;
+
+ if (idTableSize)
+ {
+ idTable = new unsigned char[idTableSize];
+ if (!source->Read(idTable, idTableSize))
+ return false;
+ }
+
+ if (header->CopyTableSize)
+ {
+ copyTable = new DB2RecordCopy[header->CopyTableSize / sizeof(DB2RecordCopy)];
+ if (!source->Read(copyTable, header->CopyTableSize))
+ return false;
+ }
+
+ return true;
+}
+
+DB2FileLoaderRegularImpl::~DB2FileLoaderRegularImpl()
+{
+ delete[] data;
+ delete[] idTable;
+ delete[] copyTable;
+ delete[] fields;
+}
+
+static char const* const nullStr = "";
+
+char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTable, std::vector& stringPool)
+{
+ if (_loadInfo->Meta->FieldCount != _header->FieldCount)
+ return nullptr;
+
+ //get struct size and index pos
+ uint32 recordsize = _loadInfo->Meta->GetRecordSize();
+
+ uint32 maxi = GetMaxId() + 1;
+
+ using index_entry_t = char*;
+
+ records = maxi;
+ indexTable = new index_entry_t[maxi];
+ memset(indexTable, 0, maxi * sizeof(index_entry_t));
+
+ char* dataTable = new char[(_header->RecordCount + (_header->CopyTableSize / 8)) * recordsize];
+
+ // we store flat holders pool as single memory block
+ std::size_t stringFields = _loadInfo->GetStringFieldCount(false);
+ std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true);
+
+ // each string field at load have array of string for each locale
+ std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*);
+ char* stringHoldersPool = nullptr;
+ if (stringFields)
+ {
+ std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * _header->RecordCount;
+
+ stringHoldersPool = new char[stringHoldersPoolSize];
+ stringPool.push_back(stringHoldersPool);
+
+ // DB2 strings expected to have at least empty string
+ for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i)
+ ((char const**)stringHoldersPool)[i] = nullStr;
+ }
+
+ uint32 offset = 0;
+
+ for (uint32 y = 0; y < _header->RecordCount; y++)
+ {
+ unsigned char const* rawRecord = GetRawRecordData(y);
+ if (!rawRecord)
+ continue;
+
+ uint32 indexVal = RecordGetId(rawRecord, y);
+
+ indexTable[indexVal] = &dataTable[offset];
+
+ uint32 fieldIndex = 0;
+ if (!_loadInfo->Meta->HasIndexFieldInData())
+ {
+ *((uint32*)(&dataTable[offset])) = indexVal;
+ offset += 4;
+ ++fieldIndex;
+ }
+
+ uint32 stringFieldOffset = 0;
+
+ for (uint32 x = 0; x < _header->FieldCount; ++x)
+ {
+ for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z)
+ {
+ switch (_loadInfo->TypesString[fieldIndex])
+ {
+ case FT_FLOAT:
+ *((float*)(&dataTable[offset])) = RecordGetFloat(rawRecord, x, z);
+ offset += 4;
+ break;
+ case FT_INT:
+ *((uint32*)(&dataTable[offset])) = RecordGetVarInt(rawRecord, x, z, _loadInfo->Fields[fieldIndex].IsSigned);
+ offset += 4;
+ break;
+ case FT_BYTE:
+ *((uint8*)(&dataTable[offset])) = RecordGetUInt8(rawRecord, x, z);
+ offset += 1;
+ break;
+ case FT_SHORT:
+ *((uint16*)(&dataTable[offset])) = RecordGetUInt16(rawRecord, x, z);
+ offset += 2;
+ break;
+ case FT_STRING:
+ case FT_STRING_NOT_LOCALIZED:
+ {
+ // init db2 string field slots by pointers to string holders
+ char const*** slot = (char const***)(&dataTable[offset]);
+ *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]);
+ if (_loadInfo->TypesString[fieldIndex] == FT_STRING)
+ stringFieldOffset += sizeof(LocalizedString);
+ else
+ stringFieldOffset += sizeof(char*);
+
+ offset += sizeof(char*);
+ break;
+ }
+ default:
+ ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName);
+ break;
+ }
+ ++fieldIndex;
+ }
+ }
+ }
+
+ return dataTable;
+}
+
+char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 locale)
+{
+ if (_loadInfo->Meta->FieldCount != _header->FieldCount)
+ return nullptr;
+
+ if (!(_header->Locale & (1 << locale)))
+ {
+ char const* sep = "";
+ std::ostringstream str;
+ for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
+ {
+ if (_header->Locale & (1 << i))
+ {
+ str << sep << localeNames[i];
+ sep = ", ";
+ }
+ }
+
+ TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]);
+ return nullptr;
+ }
+
+ char* stringPool = new char[_header->StringTableSize];
+ memcpy(stringPool, stringTable, _header->StringTableSize);
+
+ uint32 offset = 0;
+
+ for (uint32 y = 0; y < _header->RecordCount; y++)
+ {
+ unsigned char const* rawRecord = GetRawRecordData(y);
+ uint32 fieldIndex = 0;
+ if (!_loadInfo->Meta->HasIndexFieldInData())
+ {
+ offset += 4;
+ ++fieldIndex;
+ }
+
+ for (uint32 x = 0; x < _header->FieldCount; ++x)
+ {
+ for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z)
+ {
+ switch (_loadInfo->TypesString[fieldIndex])
+ {
+ case FT_FLOAT:
+ case FT_INT:
+ offset += 4;
+ break;
+ case FT_BYTE:
+ offset += 1;
+ break;
+ case FT_SHORT:
+ offset += 2;
+ break;
+ case FT_STRING:
+ {
+ // fill only not filled entries
+ LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]);
+ if (db2str->Str[locale] == nullStr)
+ {
+ char const* st = RecordGetString(rawRecord, x, z);
+ db2str->Str[locale] = stringPool + (st - (char const*)stringTable);
+ }
+
+ offset += sizeof(char*);
+ break;
+ }
+ case FT_STRING_NOT_LOCALIZED:
+ {
+ char** db2str = (char**)(&dataTable[offset]);
+ char const* st = RecordGetString(rawRecord, x, z);
+ *db2str = stringPool + (st - (char const*)stringTable);
+ offset += sizeof(char*);
+ break;
+ }
+ default:
+ ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName);
+ break;
+ }
+ ++fieldIndex;
+ }
+ }
+ }
+
+ return stringPool;
+}
+
+void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable)
+{
+ uint32 recordsize = _loadInfo->Meta->GetRecordSize();
+ uint32 offset = _header->RecordCount * recordsize;
+ for (uint32 c = 0; c < GetRecordCopyCount(); ++c)
+ {
+ DB2RecordCopy copy = GetRecordCopy(c);
+ if (copy.SourceRowId && copy.SourceRowId < records && copy.NewRowId < records && indexTable[copy.SourceRowId])
+ {
+ indexTable[copy.NewRowId] = &dataTable[offset];
+ memcpy(indexTable[copy.NewRowId], indexTable[copy.SourceRowId], recordsize);
+
+ if (_loadInfo->Meta->HasIndexFieldInData())
+ *((uint32*)(&dataTable[offset + GetFieldOffset(_loadInfo->Meta->GetIndexField())])) = copy.NewRowId;
+ else
+ *((uint32*)(&dataTable[offset])) = copy.NewRowId;
+
+ offset += recordsize;
+ }
+ }
+}
+
+DB2Record DB2FileLoaderRegularImpl::GetRecord(uint32 recordNumber) const
+{
+ return DB2Record(*this, recordNumber, nullptr);
+}
+
+DB2RecordCopy DB2FileLoaderRegularImpl::GetRecordCopy(uint32 copyNumber) const
+{
+ if (copyNumber >= GetRecordCopyCount())
+ return DB2RecordCopy{};
+
+ return copyTable[copyNumber];
+}
+
+uint32 DB2FileLoaderRegularImpl::GetRecordCount() const
+{
+ return _header->RecordCount;
+}
+
+uint32 DB2FileLoaderRegularImpl::GetRecordCopyCount() const
+{
+ return _header->CopyTableSize / sizeof(DB2RecordCopy);
+}
+
+unsigned char const* DB2FileLoaderRegularImpl::GetRawRecordData(uint32 recordNumber) const
+{
+ if (recordNumber >= _header->RecordCount)
+ return nullptr;
+
+ return data + recordNumber * _header->RecordSize;
+}
+
+uint32 DB2FileLoaderRegularImpl::RecordGetId(unsigned char const* record, uint32 recordIndex) const
+{
+ if (_loadInfo->Meta->HasIndexFieldInData())
+ return RecordGetVarInt(record, _loadInfo->Meta->GetIndexField(), 0, false);
+
+ return (reinterpret_cast(idTable))[recordIndex];
+}
+
+uint8 DB2FileLoaderRegularImpl::RecordGetUInt8(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ ASSERT(GetFieldSize(field) == 1);
+ return *reinterpret_cast(record + GetFieldOffset(field) + arrayIndex * sizeof(uint8));
+}
+
+uint16 DB2FileLoaderRegularImpl::RecordGetUInt16(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ ASSERT(GetFieldSize(field) == 2);
+ uint16 val = *reinterpret_cast(record + GetFieldOffset(field) + arrayIndex * sizeof(uint16));
+ EndianConvert(val);
+ return val;
+}
+
+uint32 DB2FileLoaderRegularImpl::RecordGetUInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ return RecordGetVarInt(record, field, arrayIndex, false);
+}
+
+int32 DB2FileLoaderRegularImpl::RecordGetInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ return int32(RecordGetVarInt(record, field, arrayIndex, true));
+}
+
+float DB2FileLoaderRegularImpl::RecordGetFloat(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ float val = *reinterpret_cast(record + GetFieldOffset(field) + arrayIndex * sizeof(float));
+ EndianConvert(val);
+ return val;
+}
+
+char const* DB2FileLoaderRegularImpl::RecordGetString(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ uint32 stringOffset = *reinterpret_cast(record + GetFieldOffset(field) + arrayIndex * sizeof(uint32));
+ EndianConvert(stringOffset);
+ ASSERT(stringOffset < _header->StringTableSize);
+ return reinterpret_cast(stringTable + stringOffset);
+}
+
+uint32 DB2FileLoaderRegularImpl::RecordGetVarInt(unsigned char const* record, uint32 field, uint32 arrayIndex, bool isSigned) const
+{
+ ASSERT(field < _header->FieldCount);
+ uint32 val = *reinterpret_cast(record + GetFieldOffset(field) + arrayIndex * (4 - fields[field].UnusedBits / 8));
+ EndianConvert(val);
+ if (isSigned)
+ return int32(val) << fields[field].UnusedBits >> fields[field].UnusedBits;
+
+ return val << fields[field].UnusedBits >> fields[field].UnusedBits;
+}
+
+uint16 DB2FileLoaderRegularImpl::GetFieldOffset(uint32 field) const
+{
+ ASSERT(field < _header->FieldCount);
+ return fields[field].Offset;
+}
+
+uint16 DB2FileLoaderRegularImpl::GetFieldSize(uint32 field) const
+{
+ ASSERT(field < _header->FieldCount);
+ return 4 - fields[field].UnusedBits / 8;
+}
+
+std::size_t* DB2FileLoaderRegularImpl::RecordCreateDetachedFieldOffsets(std::size_t* /*oldOffsets*/) const
+{
+ return nullptr;
+}
+
+void DB2FileLoaderRegularImpl::RecordDestroyFieldOffsets(std::size_t*& /*fieldOffsets*/) const
+{
+}
+
+uint32 DB2FileLoaderRegularImpl::GetMaxId() const
+{
+ uint32 maxId = 0;
+ for (uint32 row = 0; row < _header->RecordCount; ++row)
+ {
+ uint32 id = RecordGetId(GetRawRecordData(row), row);
+ if (id > maxId)
+ maxId = id;
+ }
+
+ for (uint32 copy = 0; copy < GetRecordCopyCount(); ++copy)
+ {
+ uint32 id = GetRecordCopy(copy).NewRowId;
+ if (id > maxId)
+ maxId = id;
+ }
+
+ return maxId;
+}
+
+DB2FileLoaderSparseImpl::DB2FileLoaderSparseImpl()
+{
+ fileName = nullptr;
+ _loadInfo = nullptr;
+ _fieldAndArrayOffsets = nullptr;
+ _header = nullptr;
+ fields = nullptr;
+ dataStart = 0;
+ data = nullptr;
+ offsets = nullptr;
+}
+
+DB2FileLoaderSparseImpl::~DB2FileLoaderSparseImpl()
+{
+ delete[] _fieldAndArrayOffsets;
+ delete[] data;
+ delete[] offsets;
+ delete[] fields;
+}
+
+bool DB2FileLoaderSparseImpl::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header)
+{
+ _loadInfo = loadInfo;
+ _header = header;
+ fileName = source->GetFileName();
+
+ fields = new FieldEntry[header->FieldCount];
+ if (!source->Read(fields, header->FieldCount * sizeof(FieldEntry)))
+ return false;
+
+ dataStart = source->GetPosition();
+
+ data = new unsigned char[header->StringTableSize - dataStart];
+
+ if (!source->Read(data, header->StringTableSize - dataStart))
+ return false;
+
+ offsets = new OffsetTableEntry[header->MaxId - header->MinId + 1];
+ if (!source->Read(offsets, (header->MaxId - header->MinId + 1) * 6))
+ return false;
+
+ _fieldAndArrayOffsets = new std::size_t[_loadInfo->Meta->FieldCount + _loadInfo->FieldCount - (!_loadInfo->Meta->HasIndexFieldInData() ? 1 : 0)];
+ return true;
+}
+
+char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable, std::vector& stringPool)
+{
+ if (_loadInfo->Meta->FieldCount != _header->FieldCount)
+ return NULL;
+
+ //get struct size and index pos
+ uint32 recordsize = _loadInfo->Meta->GetRecordSize();
+
+ uint32 offsetCount = _header->MaxId - _header->MinId + 1;
+ uint32 records = 0;
+ uint32 expandedDataSize = 0;
+ for (uint32 i = 0; i < offsetCount; ++i)
+ {
+ if (offsets[i].FileOffset && offsets[i].RecordSize)
+ {
+ ++records;
+ expandedDataSize += offsets[i].RecordSize;
+ }
+ }
+
+ using index_entry_t = char*;
+
+ maxId = _header->MaxId + 1;
+ indexTable = new index_entry_t[maxId];
+ memset(indexTable, 0, maxId * sizeof(index_entry_t));
+
+ char* dataTable = new char[records * recordsize];
+
+ // we store flat holders pool as single memory block
+ std::size_t stringFields = _loadInfo->GetStringFieldCount(false);
+ std::size_t localizedStringFields = _loadInfo->GetStringFieldCount(true);
+
+ // each string field at load have array of string for each locale
+ std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*);
+ std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * records;
+
+ char* stringHoldersPool = new char[stringHoldersPoolSize];
+ stringPool.push_back(stringHoldersPool);
+
+ // DB2 strings expected to have at least empty string
+ for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i)
+ ((char const**)stringHoldersPool)[i] = nullStr;
+
+ char* stringTable = new char[expandedDataSize - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))];
+ memset(stringTable, 0, expandedDataSize - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*)));
+ stringPool.push_back(stringTable);
+ char* stringPtr = stringTable;
+
+ uint32 offset = 0;
+ uint32 recordNum = 0;
+ for (uint32 y = 0; y < offsetCount; ++y)
+ {
+ unsigned char const* rawRecord = GetRawRecordData(y);
+ if (!rawRecord)
+ continue;
+
+ uint32 indexVal = RecordGetId(rawRecord, y);
+ indexTable[indexVal] = &dataTable[offset];
+
+ uint32 fieldIndex = 0;
+ if (!_loadInfo->Meta->HasIndexFieldInData())
+ {
+ *((uint32*)(&dataTable[offset])) = indexVal;
+ offset += 4;
+ ++fieldIndex;
+ }
+
+ uint32 stringFieldOffset = 0;
+ for (uint32 x = 0; x < _header->FieldCount; ++x)
+ {
+ for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z)
+ {
+ switch (_loadInfo->TypesString[fieldIndex])
+ {
+ case FT_FLOAT:
+ *((float*)(&dataTable[offset])) = RecordGetFloat(rawRecord, x, z);
+ offset += 4;
+ break;
+ case FT_INT:
+ *((uint32*)(&dataTable[offset])) = RecordGetVarInt(rawRecord, x, z, _loadInfo->Fields[fieldIndex].IsSigned);
+ offset += 4;
+ break;
+ case FT_BYTE:
+ *((uint8*)(&dataTable[offset])) = RecordGetUInt8(rawRecord, x, z);
+ offset += 1;
+ break;
+ case FT_SHORT:
+ *((uint16*)(&dataTable[offset])) = RecordGetUInt16(rawRecord, x, z);
+ offset += 2;
+ break;
+ case FT_STRING:
+ {
+ LocalizedString** slot = (LocalizedString**)(&dataTable[offset]);
+ *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]);
+ for (uint32 locale = 0; locale < TOTAL_LOCALES; ++locale)
+ if (_header->Locale & (1 << locale))
+ (*slot)->Str[locale] = stringPtr;
+ strcpy(stringPtr, RecordGetString(rawRecord, x, z));
+ stringPtr += strlen(stringPtr) + 1;
+ stringFieldOffset += sizeof(LocalizedString);
+ offset += sizeof(LocalizedString*);
+ break;
+ }
+ case FT_STRING_NOT_LOCALIZED:
+ {
+ char const*** slot = (char const***)(&dataTable[offset]);
+ *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]);
+ **slot = stringPtr;
+ strcpy(stringPtr, RecordGetString(rawRecord, x, z));
+ stringPtr += strlen(stringPtr) + 1;
+ stringFieldOffset += sizeof(char*);
+ offset += sizeof(char*);
+ break;
+ }
+ default:
+ ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName);
+ break;
+ }
+ ++fieldIndex;
+ }
+ }
+
+ ++recordNum;
+ }
+
+ return dataTable;
+}
+
+char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale)
+{
+ if (_loadInfo->Meta->FieldCount != _header->FieldCount)
+ return nullptr;
+
+ if (!(_header->Locale & (1 << locale)))
+ {
+ char const* sep = "";
+ std::ostringstream str;
+ for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
+ {
+ if (_header->Locale & (1 << i))
+ {
+ str << sep << localeNames[i];
+ sep = ", ";
+ }
+ }
+
+ TC_LOG_ERROR("", "Attempted to load %s which has locales %s as %s. Check if you placed your localized db2 files in correct directory.", fileName, str.str().c_str(), localeNames[locale]);
+ return nullptr;
+ }
+
+ uint32 offsetCount = _header->MaxId - _header->MinId + 1;
+ uint32 records = 0;
+ for (uint32 i = 0; i < offsetCount; ++i)
+ if (offsets[i].FileOffset && offsets[i].RecordSize)
+ ++records;
+
+ uint32 recordsize = _loadInfo->Meta->GetRecordSize();
+ std::size_t stringFields = _loadInfo->GetStringFieldCount(true);
+ char* stringTable = new char[_header->StringTableSize - dataStart - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))];
+ memset(stringTable, 0, _header->StringTableSize - dataStart - records * ((recordsize - (!_loadInfo->Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*)));
+ char* stringPtr = stringTable;
+
+ uint32 offset = 0;
+
+ for (uint32 y = 0; y < offsetCount; y++)
+ {
+ unsigned char const* rawRecord = GetRawRecordData(y);
+ if (!rawRecord)
+ continue;
+
+ uint32 fieldIndex = 0;
+ if (!_loadInfo->Meta->HasIndexFieldInData())
+ {
+ offset += 4;
+ ++fieldIndex;
+ }
+
+ for (uint32 x = 0; x < _header->FieldCount; ++x)
+ {
+ for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z)
+ {
+ switch (_loadInfo->TypesString[fieldIndex])
+ {
+ case FT_FLOAT:
+ offset += 4;
+ break;
+ case FT_INT:
+ offset += 4;
+ break;
+ case FT_BYTE:
+ offset += 1;
+ break;
+ case FT_SHORT:
+ offset += 2;
+ break;
+ case FT_STRING:
+ {
+ LocalizedString* db2str = *(LocalizedString**)(&dataTable[offset]);
+ db2str->Str[locale] = stringPtr;
+ strcpy(stringPtr, RecordGetString(rawRecord, x, z));
+ stringPtr += strlen(stringPtr) + 1;
+ offset += sizeof(char*);
+ break;
+ }
+ case FT_STRING_NOT_LOCALIZED:
+ offset += sizeof(char*);
+ break;
+ default:
+ ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->TypesString[x], fileName);
+ break;
+ }
+ ++fieldIndex;
+ }
+ }
+ }
+
+ return stringTable;
+}
+
+DB2Record DB2FileLoaderSparseImpl::GetRecord(uint32 recordNumber) const
+{
+ return DB2Record(*this, recordNumber, _fieldAndArrayOffsets);
+}
+
+DB2RecordCopy DB2FileLoaderSparseImpl::GetRecordCopy(uint32 /*recordId*/) const
+{
+ return DB2RecordCopy{};
+}
+
+uint32 DB2FileLoaderSparseImpl::GetRecordCount() const
+{
+ return _header->MaxId - _header->MinId + 1;
+}
+
+uint32 DB2FileLoaderSparseImpl::GetRecordCopyCount() const
+{
+ return 0;
+}
+
+unsigned char const* DB2FileLoaderSparseImpl::GetRawRecordData(uint32 recordNumber) const
+{
+ if (recordNumber > (_header->MaxId - _header->MinId) || !offsets[recordNumber].FileOffset || !offsets[recordNumber].RecordSize)
+ return nullptr;
+
+ unsigned char const* rawRecord = &data[offsets[recordNumber].FileOffset - dataStart];
+ CalculateAndStoreFieldOffsets(rawRecord);
+ return rawRecord;
+}
+
+uint32 DB2FileLoaderSparseImpl::RecordGetId(unsigned char const* record, uint32 recordIndex) const
+{
+ if (_loadInfo->Meta->HasIndexFieldInData())
+ return RecordGetVarInt(record, _loadInfo->Meta->GetIndexField(), 0, false);
+
+ return _header->MinId + recordIndex;
+}
+
+uint8 DB2FileLoaderSparseImpl::RecordGetUInt8(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ ASSERT(GetFieldSize(field) == 1);
+ return *reinterpret_cast(record + GetFieldOffset(field, arrayIndex));
+}
+
+uint16 DB2FileLoaderSparseImpl::RecordGetUInt16(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ ASSERT(GetFieldSize(field) == 2);
+ uint16 val = *reinterpret_cast(record + GetFieldOffset(field, arrayIndex));
+ EndianConvert(val);
+ return val;
+}
+
+uint32 DB2FileLoaderSparseImpl::RecordGetUInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ return RecordGetVarInt(record, field, arrayIndex, false);
+}
+
+int32 DB2FileLoaderSparseImpl::RecordGetInt32(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ return int32(RecordGetVarInt(record, field, arrayIndex, true));
+}
+
+float DB2FileLoaderSparseImpl::RecordGetFloat(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ float val = *reinterpret_cast(record + GetFieldOffset(field, arrayIndex));
+ EndianConvert(val);
+ return val;
+}
+
+char const* DB2FileLoaderSparseImpl::RecordGetString(unsigned char const* record, uint32 field, uint32 arrayIndex) const
+{
+ ASSERT(field < _header->FieldCount);
+ return reinterpret_cast(record + GetFieldOffset(field, arrayIndex));
+}
+
+uint32 DB2FileLoaderSparseImpl::RecordGetVarInt(unsigned char const* record, uint32 field, uint32 arrayIndex, bool isSigned) const
+{
+ ASSERT(field < _header->FieldCount);
+ uint32 val = *reinterpret_cast(record + GetFieldOffset(field, arrayIndex));
+ EndianConvert(val);
+ if (isSigned)
+ return int32(val) << fields[field].UnusedBits >> fields[field].UnusedBits;
+
+ return val << fields[field].UnusedBits >> fields[field].UnusedBits;
+}
+
+uint16 DB2FileLoaderSparseImpl::GetFieldOffset(uint32 field, uint32 arrayIndex) const
+{
+ return _fieldAndArrayOffsets[_fieldAndArrayOffsets[field] + arrayIndex];
+}
+
+uint16 DB2FileLoaderSparseImpl::GetFieldSize(uint32 field) const
+{
+ ASSERT(field < _header->FieldCount);
+ return 4 - fields[field].UnusedBits / 8;
+}
+
+std::size_t* DB2FileLoaderSparseImpl::RecordCreateDetachedFieldOffsets(std::size_t* oldOffsets) const
+{
+ if (oldOffsets != _fieldAndArrayOffsets)
+ return oldOffsets;
+
+ uint32 size = _loadInfo->Meta->FieldCount + _loadInfo->FieldCount - (!_loadInfo->Meta->HasIndexFieldInData() ? 1 : 0);
+ std::size_t* newOffsets = new std::size_t[size];
+ memcpy(newOffsets, _fieldAndArrayOffsets, size * sizeof(std::size_t));
+ return newOffsets;
+}
+
+void DB2FileLoaderSparseImpl::RecordDestroyFieldOffsets(std::size_t*& fieldOffsets) const
+{
+ if (fieldOffsets == _fieldAndArrayOffsets)
+ return;
+
+ delete[] fieldOffsets;
+ fieldOffsets = nullptr;
+}
+
+void DB2FileLoaderSparseImpl::CalculateAndStoreFieldOffsets(unsigned char const* rawRecord) const
+{
+ std::size_t offset = 0;
+ uint32 combinedField = _loadInfo->Meta->FieldCount;
+ for (uint32 field = 0; field < _loadInfo->Meta->FieldCount; ++field)
+ {
+ _fieldAndArrayOffsets[field] = combinedField;
+ for (uint32 arr = 0; arr < _loadInfo->Meta->ArraySizes[field]; ++arr)
+ {
+ _fieldAndArrayOffsets[combinedField] = offset;
+ switch (_loadInfo->Meta->Types[field])
+ {
+ case FT_BYTE:
+ case FT_SHORT:
+ case FT_INT:
+ offset += GetFieldSize(field);
+ break;
+ case FT_FLOAT:
+ offset += sizeof(float);
+ break;
+ case FT_STRING:
+ offset += strlen(reinterpret_cast(rawRecord) + offset) + 1;
+ break;
+ default:
+ ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo->Meta->Types[field], fileName);
+ break;
+ }
+ ++combinedField;
+ }
+ }
+}
+
+uint32 DB2FileLoaderSparseImpl::GetMaxId() const
+{
+ return _header->MaxId;
+}
+
+DB2Record::DB2Record(DB2FileLoaderImpl const& db2, uint32 recordIndex, std::size_t* fieldOffsets)
+ : _db2(db2), _recordIndex(recordIndex), _recordData(db2.GetRawRecordData(recordIndex)), _fieldOffsets(fieldOffsets)
+{
+}
+
+DB2Record::~DB2Record()
+{
+ _db2.RecordDestroyFieldOffsets(_fieldOffsets);
+}
+
+DB2Record::operator bool()
+{
+ return _recordData != nullptr;
+}
+
+uint32 DB2Record::GetId() const
+{
+ return _db2.RecordGetId(_recordData, _recordIndex);
+}
+
+uint8 DB2Record::GetUInt8(uint32 field, uint32 arrayIndex) const
+{
+ return _db2.RecordGetUInt8(_recordData, field, arrayIndex);
+}
+
+uint16 DB2Record::GetUInt16(uint32 field, uint32 arrayIndex) const
+{
+ return _db2.RecordGetUInt16(_recordData, field, arrayIndex);
+}
+
+uint32 DB2Record::GetUInt32(uint32 field, uint32 arrayIndex) const
+{
+ return _db2.RecordGetUInt32(_recordData, field, arrayIndex);
+}
+
+int32 DB2Record::GetInt32(uint32 field, uint32 arrayIndex) const
+{
+ return _db2.RecordGetInt32(_recordData, field, arrayIndex);
+}
+
+float DB2Record::GetFloat(uint32 field, uint32 arrayIndex) const
+{
+ return _db2.RecordGetFloat(_recordData, field, arrayIndex);
+}
+
+char const* DB2Record::GetString(uint32 field, uint32 arrayIndex) const
+{
+ return _db2.RecordGetString(_recordData, field, arrayIndex);
+}
+
+void DB2Record::MakePersistent()
+{
+ _fieldOffsets = _db2.RecordCreateDetachedFieldOffsets(_fieldOffsets);
+}
+
+DB2FileLoader::DB2FileLoader() : _impl(nullptr)
+{
+}
+
+DB2FileLoader::~DB2FileLoader()
+{
+ delete _impl;
+}
+
+bool DB2FileLoader::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo)
+{
+ if (!source->IsOpen())
+ return false;
+
+ if (!source->Read(&_header, sizeof(DB2Header)))
+ return false;
+
+ EndianConvert(_header.Signature);
+ EndianConvert(_header.RecordCount);
+ EndianConvert(_header.FieldCount);
+ EndianConvert(_header.RecordSize);
+ EndianConvert(_header.StringTableSize);
+ EndianConvert(_header.TableHash);
+ EndianConvert(_header.LayoutHash);
+ EndianConvert(_header.MinId);
+ EndianConvert(_header.MaxId);
+ EndianConvert(_header.Locale);
+ EndianConvert(_header.CopyTableSize);
+ EndianConvert(_header.Flags);
+ EndianConvert(_header.IndexField);
+
+ if (_header.Signature != 0x35424457) //'WDB5'
+ return false;
+
+ if (_header.LayoutHash != loadInfo->Meta->LayoutHash)
+ return false;
+
+ if (!(_header.Flags & 0x1))
+ _impl = new DB2FileLoaderRegularImpl();
+ else
+ _impl = new DB2FileLoaderSparseImpl();
+
+ return _impl->Load(source, loadInfo, &_header);
+}
+
+char* DB2FileLoader::AutoProduceData(uint32& count, char**& indexTable, std::vector& stringPool)
+{
+ return _impl->AutoProduceData(count, indexTable, stringPool);
+}
+
+char* DB2FileLoader::AutoProduceStrings(char* dataTable, uint32 locale)
+{
+ return _impl->AutoProduceStrings(dataTable, locale);
+}
+
+void DB2FileLoader::AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable)
+{
+ _impl->AutoProduceRecordCopies(records, indexTable, dataTable);
+}
+
+uint32 DB2FileLoader::GetRecordCount() const
+{
+ return _impl->GetRecordCount();
+}
+
+uint32 DB2FileLoader::GetRecordCopyCount() const
+{
+ return _impl->GetRecordCopyCount();
+}
+
+uint32 DB2FileLoader::GetMaxId() const
+{
+ return _impl->GetMaxId();
+}
+
+DB2Record DB2FileLoader::GetRecord(uint32 recordNumber) const
+{
+ return _impl->GetRecord(recordNumber);
+}
+
+DB2RecordCopy DB2FileLoader::GetRecordCopy(uint32 copyNumber) const
+{
+ return _impl->GetRecordCopy(copyNumber);
+}
diff --git a/src/common/DataStores/DB2FileLoader.h b/src/common/DataStores/DB2FileLoader.h
new file mode 100644
index 00000000000..a8dd7d27e41
--- /dev/null
+++ b/src/common/DataStores/DB2FileLoader.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2008-2017 TrinityCore
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#ifndef DB2_FILE_LOADER_H
+#define DB2_FILE_LOADER_H
+
+#include "Define.h"
+#include
+#include
+
+class DB2FileLoaderImpl;
+struct DB2FieldMeta;
+struct DB2Meta;
+
+#pragma pack(push, 1)
+struct DB2Header
+{
+ uint32 Signature;
+ uint32 RecordCount;
+ uint32 FieldCount;
+ uint32 RecordSize;
+ uint32 StringTableSize;
+ uint32 TableHash;
+ uint32 LayoutHash;
+ uint32 MinId;
+ uint32 MaxId;
+ uint32 Locale;
+ uint32 CopyTableSize;
+ uint16 Flags;
+ int16 IndexField;
+};
+#pragma pack(pop)
+
+struct TC_COMMON_API DB2FileLoadInfo
+{
+ DB2FileLoadInfo();
+ DB2FileLoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta);
+
+ uint32 GetStringFieldCount(bool localizedOnly) const;
+
+ DB2FieldMeta const* Fields;
+ std::size_t FieldCount;
+ DB2Meta const* Meta;
+ std::string TypesString;
+};
+
+struct TC_COMMON_API DB2FileSource
+{
+ virtual ~DB2FileSource();
+
+ ///
+ /**
+ * Returns true when the source is open for reading
+ */
+ virtual bool IsOpen() const = 0;
+
+ // Reads numBytes bytes from source and places them into buffer
+ // Retu
+ virtual bool Read(void* buffer, std::size_t numBytes) = 0;
+ virtual std::size_t GetPosition() const = 0;
+ virtual char const* GetFileName() const = 0;
+};
+
+class TC_COMMON_API DB2Record
+{
+public:
+ DB2Record(DB2FileLoaderImpl const& db2, uint32 recordIndex, std::size_t* fieldOffsets);
+ ~DB2Record();
+
+ operator bool();
+
+ uint32 GetId() const;
+
+ uint8 GetUInt8(uint32 field, uint32 arrayIndex) const;
+ uint16 GetUInt16(uint32 field, uint32 arrayIndex) const;
+ uint32 GetUInt32(uint32 field, uint32 arrayIndex) const;
+ int32 GetInt32(uint32 field, uint32 arrayIndex) const;
+ float GetFloat(uint32 field, uint32 arrayIndex) const;
+ char const* GetString(uint32 field, uint32 arrayIndex) const;
+
+ // Creates its own heap allocated copy of _fieldOffsets
+ // by default _fieldOffets point to a shared array inside Loader to avoid heap allocations
+ // meaning that only one instance of DB2Record has valid offsets if the file is sparse
+ void MakePersistent();
+
+private:
+ DB2FileLoaderImpl const& _db2;
+ uint32 _recordIndex;
+ unsigned char const* _recordData;
+ std::size_t* _fieldOffsets;
+};
+
+#pragma pack(push, 1)
+struct DB2RecordCopy
+{
+ uint32 NewRowId = 0;
+ uint32 SourceRowId = 0;
+};
+#pragma pack(pop)
+
+class TC_COMMON_API DB2FileLoader
+{
+public:
+ DB2FileLoader();
+ ~DB2FileLoader();
+
+ bool Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo);
+ char* AutoProduceData(uint32& count, char**& indexTable, std::vector& stringPool);
+ char* AutoProduceStrings(char* dataTable, uint32 locale);
+ void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable);
+
+ uint32 GetCols() const { return _header.FieldCount; }
+ uint32 GetRecordCount() const;
+ uint32 GetRecordCopyCount() const;
+ uint32 GetTableHash() const { return _header.TableHash; }
+ uint32 GetLayoutHash() const { return _header.LayoutHash; }
+ uint32 GetMaxId() const;
+
+ DB2Record GetRecord(uint32 recordNumber) const;
+ DB2RecordCopy GetRecordCopy(uint32 copyNumber) const;
+
+private:
+ DB2FileLoaderImpl* _impl;
+ DB2Header _header;
+};
+
+#endif
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index e8e93a0d87e..f17ce912a9b 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -21,12 +21,12 @@
#ifndef DB2LoadInfo_h__
#define DB2LoadInfo_h__
-#include "DB2StorageLoader.h"
+#include "DB2DatabaseLoader.h"
#include "DB2Metadata.h"
struct AchievementLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -46,13 +46,14 @@ struct AchievementLoadInfo
{ false, FT_BYTE, "MinimumCriteria" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT);
+ return &loadInfo;
}
};
struct AnimKitLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -61,13 +62,14 @@ struct AnimKitLoadInfo
{ false, FT_SHORT, "OneShotStopAnimKitID" },
{ false, FT_SHORT, "LowDefAnimKitID" },
};
- return { &fields[0], std::extent::value, AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT);
+ return &loadInfo;
}
};
struct AreaGroupMemberLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -75,13 +77,14 @@ struct AreaGroupMemberLoadInfo
{ false, FT_SHORT, "AreaGroupID" },
{ false, FT_SHORT, "AreaID" },
};
- return { &fields[0], std::extent::value, AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER);
+ return &loadInfo;
}
};
struct AreaTableLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -114,13 +117,14 @@ struct AreaTableLoadInfo
{ false, FT_BYTE, "WindSettingsID" },
{ false, FT_INT, "UWIntroSound" },
};
- return { &fields[0], std::extent::value, AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE);
+ return &loadInfo;
}
};
struct AreaTriggerLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -142,13 +146,14 @@ struct AreaTriggerLoadInfo
{ false, FT_BYTE, "Flag" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER);
+ return &loadInfo;
}
};
struct ArmorLocationLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -159,13 +164,14 @@ struct ArmorLocationLoadInfo
{ false, FT_FLOAT, "Modifier4" },
{ false, FT_FLOAT, "Modifier5" },
};
- return { &fields[0], std::extent::value, ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION);
+ return &loadInfo;
}
};
struct ArtifactLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -179,13 +185,14 @@ struct ArtifactLoadInfo
{ false, FT_BYTE, "ArtifactCategoryID" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT);
+ return &loadInfo;
}
};
struct ArtifactAppearanceLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -205,13 +212,14 @@ struct ArtifactAppearanceLoadInfo
{ false, FT_INT, "ItemAppearanceID" },
{ false, FT_INT, "AltItemAppearanceID" },
};
- return { &fields[0], std::extent::value, ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE);
+ return &loadInfo;
}
};
struct ArtifactAppearanceSetLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -225,13 +233,14 @@ struct ArtifactAppearanceSetLoadInfo
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET);
+ return &loadInfo;
}
};
struct ArtifactCategoryLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -239,13 +248,14 @@ struct ArtifactCategoryLoadInfo
{ false, FT_SHORT, "ArtifactKnowledgeCurrencyID" },
{ false, FT_SHORT, "ArtifactKnowledgeMultiplierCurveID" },
};
- return { &fields[0], std::extent::value, ArtifactCategoryMeta::Instance(), HOTFIX_SEL_ARTIFACT_CATEGORY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactCategoryMeta::Instance(), HOTFIX_SEL_ARTIFACT_CATEGORY);
+ return &loadInfo;
}
};
struct ArtifactPowerLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -257,13 +267,14 @@ struct ArtifactPowerLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_INT, "RelicType" },
};
- return { &fields[0], std::extent::value, ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER);
+ return &loadInfo;
}
};
struct ArtifactPowerLinkLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -271,13 +282,14 @@ struct ArtifactPowerLinkLoadInfo
{ false, FT_SHORT, "FromArtifactPowerID" },
{ false, FT_SHORT, "ToArtifactPowerID" },
};
- return { &fields[0], std::extent::value, ArtifactPowerLinkMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_LINK };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactPowerLinkMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_LINK);
+ return &loadInfo;
}
};
struct ArtifactPowerRankLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -288,13 +300,14 @@ struct ArtifactPowerRankLoadInfo
{ false, FT_SHORT, "Unknown" },
{ false, FT_BYTE, "Rank" },
};
- return { &fields[0], std::extent::value, ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK);
+ return &loadInfo;
}
};
struct ArtifactQuestXpLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -310,13 +323,14 @@ struct ArtifactQuestXpLoadInfo
{ false, FT_INT, "Exp9" },
{ false, FT_INT, "Exp10" },
};
- return { &fields[0], std::extent::value, ArtifactQuestXPMeta::Instance(), HOTFIX_SEL_ARTIFACT_QUEST_XP };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ArtifactQuestXPMeta::Instance(), HOTFIX_SEL_ARTIFACT_QUEST_XP);
+ return &loadInfo;
}
};
struct AuctionHouseLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -326,26 +340,28 @@ struct AuctionHouseLoadInfo
{ false, FT_BYTE, "DepositRate" },
{ false, FT_BYTE, "ConsignmentRate" },
};
- return { &fields[0], std::extent::value, AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE);
+ return &loadInfo;
}
};
struct BankBagSlotPricesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_INT, "Cost" },
};
- return { &fields[0], std::extent::value, BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES);
+ return &loadInfo;
}
};
struct BannedAddonsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -354,13 +370,14 @@ struct BannedAddonsLoadInfo
{ false, FT_STRING_NOT_LOCALIZED, "Version" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS);
+ return &loadInfo;
}
};
struct BarberShopStyleLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -373,13 +390,14 @@ struct BarberShopStyleLoadInfo
{ false, FT_BYTE, "Data" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE);
+ return &loadInfo;
}
};
struct BattlePetBreedQualityLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -387,13 +405,14 @@ struct BattlePetBreedQualityLoadInfo
{ false, FT_FLOAT, "Modifier" },
{ false, FT_BYTE, "Quality" },
};
- return { &fields[0], std::extent::value, BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY);
+ return &loadInfo;
}
};
struct BattlePetBreedStateLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -402,13 +421,14 @@ struct BattlePetBreedStateLoadInfo
{ false, FT_BYTE, "BreedID" },
{ false, FT_BYTE, "State" },
};
- return { &fields[0], std::extent::value, BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE);
+ return &loadInfo;
}
};
struct BattlePetSpeciesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -422,13 +442,14 @@ struct BattlePetSpeciesLoadInfo
{ true, FT_BYTE, "Source" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES);
+ return &loadInfo;
}
};
struct BattlePetSpeciesStateLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -437,13 +458,14 @@ struct BattlePetSpeciesStateLoadInfo
{ false, FT_SHORT, "SpeciesID" },
{ false, FT_BYTE, "State" },
};
- return { &fields[0], std::extent::value, BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE);
+ return &loadInfo;
}
};
struct BattlemasterListLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -479,13 +501,14 @@ struct BattlemasterListLoadInfo
{ false, FT_BYTE, "MaxPlayers" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST);
+ return &loadInfo;
}
};
struct BroadcastTextLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -505,13 +528,14 @@ struct BroadcastTextLoadInfo
{ false, FT_INT, "SoundID2" },
{ false, FT_INT, "PlayerConditionID" },
};
- return { &fields[0], std::extent::value, BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT);
+ return &loadInfo;
}
};
struct CharSectionsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -526,13 +550,14 @@ struct CharSectionsLoadInfo
{ false, FT_BYTE, "Type" },
{ false, FT_BYTE, "Color" },
};
- return { &fields[0], std::extent::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS);
+ return &loadInfo;
}
};
struct CharStartOutfitLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -568,13 +593,14 @@ struct CharStartOutfitLoadInfo
{ false, FT_BYTE, "OutfitID" },
{ false, FT_BYTE, "PetFamilyID" },
};
- return { &fields[0], std::extent::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT);
+ return &loadInfo;
}
};
struct CharTitlesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -584,13 +610,14 @@ struct CharTitlesLoadInfo
{ false, FT_SHORT, "MaskID" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES);
+ return &loadInfo;
}
};
struct ChatChannelsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -600,13 +627,14 @@ struct ChatChannelsLoadInfo
{ false, FT_STRING, "Shortcut" },
{ false, FT_BYTE, "FactionGroup" },
};
- return { &fields[0], std::extent::value, ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS);
+ return &loadInfo;
}
};
struct ChrClassesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -630,13 +658,14 @@ struct ChrClassesLoadInfo
{ false, FT_BYTE, "Unk1" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES);
+ return &loadInfo;
}
};
struct ChrClassesXPowerTypesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -644,13 +673,14 @@ struct ChrClassesXPowerTypesLoadInfo
{ false, FT_BYTE, "ClassID" },
{ false, FT_BYTE, "PowerType" },
};
- return { &fields[0], std::extent::value, ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES);
+ return &loadInfo;
}
};
struct ChrRacesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -698,13 +728,14 @@ struct ChrRacesLoadInfo
{ false, FT_INT, "Unk2" },
{ false, FT_INT, "Unk3" },
};
- return { &fields[0], std::extent::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES);
+ return &loadInfo;
}
};
struct ChrSpecializationLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -723,13 +754,14 @@ struct ChrSpecializationLoadInfo
{ false, FT_INT, "Flags" },
{ false, FT_INT, "AnimReplacementSetID" },
};
- return { &fields[0], std::extent::value, ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION);
+ return &loadInfo;
}
};
struct CinematicCameraLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -741,13 +773,14 @@ struct CinematicCameraLoadInfo
{ false, FT_FLOAT, "OriginFacing" },
{ false, FT_SHORT, "SoundID" },
};
- return { &fields[0], std::extent::value, CinematicCameraMeta::Instance(), HOTFIX_SEL_CINEMATIC_CAMERA };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CinematicCameraMeta::Instance(), HOTFIX_SEL_CINEMATIC_CAMERA);
+ return &loadInfo;
}
};
struct CinematicSequencesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -762,13 +795,14 @@ struct CinematicSequencesLoadInfo
{ false, FT_SHORT, "Camera7" },
{ false, FT_SHORT, "Camera8" },
};
- return { &fields[0], std::extent::value, CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES);
+ return &loadInfo;
}
};
struct CreatureDisplayInfoLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -797,13 +831,14 @@ struct CreatureDisplayInfoLoadInfo
{ true, FT_BYTE, "Gender" },
{ true, FT_BYTE, "Unk700" },
};
- return { &fields[0], std::extent::value, CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO);
+ return &loadInfo;
}
};
struct CreatureDisplayInfoExtraLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -823,13 +858,14 @@ struct CreatureDisplayInfoExtraLoadInfo
{ false, FT_BYTE, "CustomDisplayOption3" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA);
+ return &loadInfo;
}
};
struct CreatureFamilyLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -845,13 +881,14 @@ struct CreatureFamilyLoadInfo
{ false, FT_BYTE, "MaxScaleLevel" },
{ false, FT_BYTE, "PetTalentType" },
};
- return { &fields[0], std::extent::value, CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY);
+ return &loadInfo;
}
};
struct CreatureModelDataLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -890,13 +927,14 @@ struct CreatureModelDataLoadInfo
{ false, FT_INT, "SoundID" },
{ false, FT_INT, "CreatureGeosetDataID" },
};
- return { &fields[0], std::extent::value, CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA);
+ return &loadInfo;
}
};
struct CreatureTypeLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -904,13 +942,14 @@ struct CreatureTypeLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE);
+ return &loadInfo;
}
};
struct CriteriaLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -927,13 +966,14 @@ struct CriteriaLoadInfo
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "EligibilityWorldStateValue" },
};
- return { &fields[0], std::extent::value, CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA);
+ return &loadInfo;
}
};
struct CriteriaTreeLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -946,13 +986,14 @@ struct CriteriaTreeLoadInfo
{ false, FT_BYTE, "Operator" },
{ true, FT_INT, "OrderIndex" },
};
- return { &fields[0], std::extent::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE);
+ return &loadInfo;
}
};
struct CurrencyTypesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -969,13 +1010,14 @@ struct CurrencyTypesLoadInfo
{ false, FT_BYTE, "Quality" },
{ false, FT_INT, "SpellWeight" },
};
- return { &fields[0], std::extent::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES);
+ return &loadInfo;
}
};
struct CurveLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -983,13 +1025,14 @@ struct CurveLoadInfo
{ false, FT_BYTE, "Type" },
{ false, FT_BYTE, "Unused" },
};
- return { &fields[0], std::extent::value, CurveMeta::Instance(), HOTFIX_SEL_CURVE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CurveMeta::Instance(), HOTFIX_SEL_CURVE);
+ return &loadInfo;
}
};
struct CurvePointLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -999,13 +1042,14 @@ struct CurvePointLoadInfo
{ false, FT_SHORT, "CurveID" },
{ false, FT_BYTE, "Index" },
};
- return { &fields[0], std::extent::value, CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT);
+ return &loadInfo;
}
};
struct DestructibleModelDataLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1033,13 +1077,14 @@ struct DestructibleModelDataLoadInfo
{ false, FT_BYTE, "DoNotHighlight" },
{ false, FT_BYTE, "HealEffect" },
};
- return { &fields[0], std::extent::value, DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA);
+ return &loadInfo;
}
};
struct DifficultyLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1058,13 +1103,14 @@ struct DifficultyLoadInfo
{ false, FT_BYTE, "ItemBonusTreeModID" },
{ false, FT_BYTE, "OrderIndex" },
};
- return { &fields[0], std::extent::value, DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY);
+ return &loadInfo;
}
};
struct DungeonEncounterLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1078,13 +1124,14 @@ struct DungeonEncounterLoadInfo
{ false, FT_BYTE, "Flags" },
{ true, FT_INT, "OrderIndex" },
};
- return { &fields[0], std::extent::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER);
+ return &loadInfo;
}
};
struct DurabilityCostsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1119,26 +1166,28 @@ struct DurabilityCostsLoadInfo
{ false, FT_SHORT, "ArmorSubClassCost7" },
{ false, FT_SHORT, "ArmorSubClassCost8" },
};
- return { &fields[0], std::extent::value, DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS);
+ return &loadInfo;
}
};
struct DurabilityQualityLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_FLOAT, "QualityMod" },
};
- return { &fields[0], std::extent::value, DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY);
+ return &loadInfo;
}
};
struct EmotesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1153,13 +1202,14 @@ struct EmotesLoadInfo
{ true, FT_INT, "ClassMask" },
{ true, FT_INT, "RaceMask" },
};
- return { &fields[0], std::extent::value, EmotesMeta::Instance(), HOTFIX_SEL_EMOTES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, EmotesMeta::Instance(), HOTFIX_SEL_EMOTES);
+ return &loadInfo;
}
};
struct EmotesTextLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1167,13 +1217,14 @@ struct EmotesTextLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_SHORT, "EmoteID" },
};
- return { &fields[0], std::extent::value, EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT);
+ return &loadInfo;
}
};
struct EmotesTextSoundLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1184,13 +1235,14 @@ struct EmotesTextSoundLoadInfo
{ false, FT_BYTE, "ClassId" },
{ false, FT_INT, "SoundId" },
};
- return { &fields[0], std::extent::value, EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND);
+ return &loadInfo;
}
};
struct FactionLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1227,13 +1279,14 @@ struct FactionLoadInfo
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "FriendshipRepID" },
};
- return { &fields[0], std::extent::value, FactionMeta::Instance(), HOTFIX_SEL_FACTION };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, FactionMeta::Instance(), HOTFIX_SEL_FACTION);
+ return &loadInfo;
}
};
struct FactionTemplateLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1252,13 +1305,14 @@ struct FactionTemplateLoadInfo
{ false, FT_BYTE, "FriendMask" },
{ false, FT_BYTE, "EnemyMask" },
};
- return { &fields[0], std::extent::value, FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE);
+ return &loadInfo;
}
};
struct GameobjectsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1287,13 +1341,14 @@ struct GameobjectsLoadInfo
{ false, FT_BYTE, "Type" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS);
+ return &loadInfo;
}
};
struct GameobjectDisplayInfoLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1309,13 +1364,14 @@ struct GameobjectDisplayInfoLoadInfo
{ false, FT_FLOAT, "OverrideNameScale" },
{ false, FT_SHORT, "ObjectEffectPackageID" },
};
- return { &fields[0], std::extent::value, GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO);
+ return &loadInfo;
}
};
struct GarrAbilityLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1328,13 +1384,14 @@ struct GarrAbilityLoadInfo
{ false, FT_BYTE, "FollowerTypeID" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY);
+ return &loadInfo;
}
};
struct GarrBuildingLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1364,13 +1421,14 @@ struct GarrBuildingLoadInfo
{ true, FT_INT, "CostCurrencyAmount" },
{ true, FT_INT, "BonusAmount" },
};
- return { &fields[0], std::extent::value, GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING);
+ return &loadInfo;
}
};
struct GarrBuildingPlotInstLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1381,13 +1439,14 @@ struct GarrBuildingPlotInstLoadInfo
{ false, FT_BYTE, "GarrBuildingID" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST);
+ return &loadInfo;
}
};
struct GarrClassSpecLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1400,13 +1459,14 @@ struct GarrClassSpecLoadInfo
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC);
+ return &loadInfo;
}
};
struct GarrFollowerLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1442,13 +1502,14 @@ struct GarrFollowerLoadInfo
{ false, FT_BYTE, "AllianceFlavorTextGarrStringID" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER);
+ return &loadInfo;
}
};
struct GarrFollowerXAbilityLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1457,13 +1518,14 @@ struct GarrFollowerXAbilityLoadInfo
{ false, FT_SHORT, "GarrAbilityID" },
{ false, FT_BYTE, "FactionIndex" },
};
- return { &fields[0], std::extent::value, GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY);
+ return &loadInfo;
}
};
struct GarrPlotLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1477,13 +1539,14 @@ struct GarrPlotLoadInfo
{ false, FT_INT, "MinCount" },
{ false, FT_INT, "MaxCount" },
};
- return { &fields[0], std::extent::value, GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT);
+ return &loadInfo;
}
};
struct GarrPlotBuildingLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1491,13 +1554,14 @@ struct GarrPlotBuildingLoadInfo
{ false, FT_BYTE, "GarrPlotID" },
{ false, FT_BYTE, "GarrBuildingID" },
};
- return { &fields[0], std::extent::value, GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING);
+ return &loadInfo;
}
};
struct GarrPlotInstanceLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1505,13 +1569,14 @@ struct GarrPlotInstanceLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_BYTE, "GarrPlotID" },
};
- return { &fields[0], std::extent::value, GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE);
+ return &loadInfo;
}
};
struct GarrSiteLevelLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1527,13 +1592,14 @@ struct GarrSiteLevelLoadInfo
{ false, FT_BYTE, "MovieID" },
{ false, FT_BYTE, "Level2" },
};
- return { &fields[0], std::extent::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL);
+ return &loadInfo;
}
};
struct GarrSiteLevelPlotInstLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1544,13 +1610,14 @@ struct GarrSiteLevelPlotInstLoadInfo
{ false, FT_BYTE, "GarrPlotInstanceID" },
{ false, FT_BYTE, "Unknown" },
};
- return { &fields[0], std::extent::value, GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST);
+ return &loadInfo;
}
};
struct GemPropertiesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1559,13 +1626,14 @@ struct GemPropertiesLoadInfo
{ false, FT_SHORT, "EnchantID" },
{ false, FT_SHORT, "MinItemLevel" },
};
- return { &fields[0], std::extent::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES);
+ return &loadInfo;
}
};
struct GlyphBindableSpellLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1573,13 +1641,14 @@ struct GlyphBindableSpellLoadInfo
{ false, FT_INT, "SpellID" },
{ false, FT_SHORT, "GlyphPropertiesID" },
};
- return { &fields[0], std::extent::value, GlyphBindableSpellMeta::Instance(), HOTFIX_SEL_GLYPH_BINDABLE_SPELL };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GlyphBindableSpellMeta::Instance(), HOTFIX_SEL_GLYPH_BINDABLE_SPELL);
+ return &loadInfo;
}
};
struct GlyphPropertiesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1589,13 +1658,14 @@ struct GlyphPropertiesLoadInfo
{ false, FT_BYTE, "Type" },
{ false, FT_BYTE, "GlyphExclusiveCategoryID" },
};
- return { &fields[0], std::extent::value, GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES);
+ return &loadInfo;
}
};
struct GlyphRequiredSpecLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1603,13 +1673,14 @@ struct GlyphRequiredSpecLoadInfo
{ false, FT_SHORT, "GlyphPropertiesID" },
{ false, FT_SHORT, "ChrSpecializationID" },
};
- return { &fields[0], std::extent::value, GlyphRequiredSpecMeta::Instance(), HOTFIX_SEL_GLYPH_REQUIRED_SPEC };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GlyphRequiredSpecMeta::Instance(), HOTFIX_SEL_GLYPH_REQUIRED_SPEC);
+ return &loadInfo;
}
};
struct GuildColorBackgroundLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1618,13 +1689,14 @@ struct GuildColorBackgroundLoadInfo
{ false, FT_BYTE, "Green" },
{ false, FT_BYTE, "Blue" },
};
- return { &fields[0], std::extent::value, GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND);
+ return &loadInfo;
}
};
struct GuildColorBorderLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1633,13 +1705,14 @@ struct GuildColorBorderLoadInfo
{ false, FT_BYTE, "Green" },
{ false, FT_BYTE, "Blue" },
};
- return { &fields[0], std::extent::value, GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER);
+ return &loadInfo;
}
};
struct GuildColorEmblemLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1648,26 +1721,28 @@ struct GuildColorEmblemLoadInfo
{ false, FT_BYTE, "Green" },
{ false, FT_BYTE, "Blue" },
};
- return { &fields[0], std::extent::value, GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM);
+ return &loadInfo;
}
};
struct GuildPerkSpellsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_INT, "SpellID" },
};
- return { &fields[0], std::extent::value, GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS);
+ return &loadInfo;
}
};
struct HeirloomLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1684,13 +1759,14 @@ struct HeirloomLoadInfo
{ false, FT_BYTE, "Source" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM);
+ return &loadInfo;
}
};
struct HolidaysLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1740,13 +1816,14 @@ struct HolidaysLoadInfo
{ true, FT_BYTE, "CalendarFilterType" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS);
+ return &loadInfo;
}
};
struct ImportPriceArmorLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1756,52 +1833,56 @@ struct ImportPriceArmorLoadInfo
{ false, FT_FLOAT, "MailFactor" },
{ false, FT_FLOAT, "PlateFactor" },
};
- return { &fields[0], std::extent::value, ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR);
+ return &loadInfo;
}
};
struct ImportPriceQualityLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_FLOAT, "Factor" },
};
- return { &fields[0], std::extent::value, ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY);
+ return &loadInfo;
}
};
struct ImportPriceShieldLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_FLOAT, "Factor" },
};
- return { &fields[0], std::extent::value, ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD);
+ return &loadInfo;
}
};
struct ImportPriceWeaponLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_FLOAT, "Factor" },
};
- return { &fields[0], std::extent::value, ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON);
+ return &loadInfo;
}
};
struct ItemLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1815,13 +1896,14 @@ struct ItemLoadInfo
{ false, FT_BYTE, "Sheath" },
{ false, FT_BYTE, "GroupSoundsID" },
};
- return { &fields[0], std::extent::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM);
+ return &loadInfo;
}
};
struct ItemAppearanceLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1831,13 +1913,14 @@ struct ItemAppearanceLoadInfo
{ false, FT_INT, "UIOrder" },
{ false, FT_BYTE, "ObjectComponentSlot" },
};
- return { &fields[0], std::extent::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE);
+ return &loadInfo;
}
};
struct ItemArmorQualityLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1851,13 +1934,14 @@ struct ItemArmorQualityLoadInfo
{ false, FT_FLOAT, "QualityMod7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY);
+ return &loadInfo;
}
};
struct ItemArmorShieldLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1871,13 +1955,14 @@ struct ItemArmorShieldLoadInfo
{ false, FT_FLOAT, "Quality7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD);
+ return &loadInfo;
}
};
struct ItemArmorTotalLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1888,26 +1973,28 @@ struct ItemArmorTotalLoadInfo
{ false, FT_FLOAT, "Value4" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL);
+ return &loadInfo;
}
};
struct ItemBagFamilyLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
};
- return { &fields[0], std::extent::value, ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY);
+ return &loadInfo;
}
};
struct ItemBonusLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1918,26 +2005,28 @@ struct ItemBonusLoadInfo
{ false, FT_BYTE, "Type" },
{ false, FT_BYTE, "Index" },
};
- return { &fields[0], std::extent::value, ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS);
+ return &loadInfo;
}
};
struct ItemBonusListLevelDeltaLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ true, FT_SHORT, "Delta" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, ItemBonusListLevelDeltaMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemBonusListLevelDeltaMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA);
+ return &loadInfo;
}
};
struct ItemBonusTreeNodeLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1947,13 +2036,14 @@ struct ItemBonusTreeNodeLoadInfo
{ false, FT_SHORT, "BonusListID" },
{ false, FT_BYTE, "BonusTreeModID" },
};
- return { &fields[0], std::extent::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE);
+ return &loadInfo;
}
};
struct ItemChildEquipmentLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1962,13 +2052,14 @@ struct ItemChildEquipmentLoadInfo
{ false, FT_INT, "AltItemID" },
{ false, FT_BYTE, "AltEquipmentSlot" },
};
- return { &fields[0], std::extent::value, ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT);
+ return &loadInfo;
}
};
struct ItemClassLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -1978,26 +2069,28 @@ struct ItemClassLoadInfo
{ false, FT_BYTE, "OldEnumValue" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS);
+ return &loadInfo;
}
};
struct ItemCurrencyCostLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_INT, "ItemId" },
};
- return { &fields[0], std::extent::value, ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST);
+ return &loadInfo;
}
};
struct ItemDamageAmmoLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2011,13 +2104,14 @@ struct ItemDamageAmmoLoadInfo
{ false, FT_FLOAT, "DPS7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO);
+ return &loadInfo;
}
};
struct ItemDamageOneHandLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2031,13 +2125,14 @@ struct ItemDamageOneHandLoadInfo
{ false, FT_FLOAT, "DPS7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND);
+ return &loadInfo;
}
};
struct ItemDamageOneHandCasterLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2051,13 +2146,14 @@ struct ItemDamageOneHandCasterLoadInfo
{ false, FT_FLOAT, "DPS7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER);
+ return &loadInfo;
}
};
struct ItemDamageTwoHandLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2071,13 +2167,14 @@ struct ItemDamageTwoHandLoadInfo
{ false, FT_FLOAT, "DPS7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND);
+ return &loadInfo;
}
};
struct ItemDamageTwoHandCasterLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2091,13 +2188,14 @@ struct ItemDamageTwoHandCasterLoadInfo
{ false, FT_FLOAT, "DPS7" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER);
+ return &loadInfo;
}
};
struct ItemDisenchantLootLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2109,13 +2207,14 @@ struct ItemDisenchantLootLoadInfo
{ true, FT_BYTE, "ItemSubClass" },
{ false, FT_BYTE, "ItemQuality" },
};
- return { &fields[0], std::extent::value, ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT);
+ return &loadInfo;
}
};
struct ItemEffectLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2130,13 +2229,14 @@ struct ItemEffectLoadInfo
{ false, FT_BYTE, "OrderIndex" },
{ false, FT_BYTE, "Trigger" },
};
- return { &fields[0], std::extent::value, ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT);
+ return &loadInfo;
}
};
struct ItemExtendedCostLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2168,13 +2268,14 @@ struct ItemExtendedCostLoadInfo
{ false, FT_BYTE, "RequirementFlags" },
{ false, FT_BYTE, "RequiredAchievement" },
};
- return { &fields[0], std::extent::value, ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST);
+ return &loadInfo;
}
};
struct ItemLimitCategoryLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2183,13 +2284,14 @@ struct ItemLimitCategoryLoadInfo
{ false, FT_BYTE, "Quantity" },
{ false, FT_BYTE, "Flags" },
};
- return { &fields[0], std::extent::value, ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY);
+ return &loadInfo;
}
};
struct ItemModifiedAppearanceLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2200,13 +2302,14 @@ struct ItemModifiedAppearanceLoadInfo
{ false, FT_BYTE, "SourceType" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE);
+ return &loadInfo;
}
};
struct ItemPriceBaseLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2215,13 +2318,14 @@ struct ItemPriceBaseLoadInfo
{ false, FT_FLOAT, "WeaponFactor" },
{ false, FT_SHORT, "ItemLevel" },
};
- return { &fields[0], std::extent::value, ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE);
+ return &loadInfo;
}
};
struct ItemRandomPropertiesLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2233,13 +2337,14 @@ struct ItemRandomPropertiesLoadInfo
{ false, FT_SHORT, "Enchantment4" },
{ false, FT_SHORT, "Enchantment5" },
};
- return { &fields[0], std::extent::value, ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES);
+ return &loadInfo;
}
};
struct ItemRandomSuffixLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2256,13 +2361,14 @@ struct ItemRandomSuffixLoadInfo
{ false, FT_SHORT, "AllocationPct4" },
{ false, FT_SHORT, "AllocationPct5" },
};
- return { &fields[0], std::extent::value, ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX);
+ return &loadInfo;
}
};
struct ItemSearchNameLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2283,13 +2389,14 @@ struct ItemSearchNameLoadInfo
{ false, FT_BYTE, "RequiredLevel" },
{ true, FT_INT, "AllowableClass" },
};
- return { &fields[0], std::extent::value, ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME);
+ return &loadInfo;
}
};
struct ItemSetLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2316,13 +2423,14 @@ struct ItemSetLoadInfo
{ false, FT_INT, "RequiredSkill" },
{ false, FT_INT, "Flags" },
};
- return { &fields[0], std::extent::value, ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET);
+ return &loadInfo;
}
};
struct ItemSetSpellLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2332,13 +2440,14 @@ struct ItemSetSpellLoadInfo
{ false, FT_SHORT, "ChrSpecID" },
{ false, FT_BYTE, "Threshold" },
};
- return { &fields[0], std::extent::value, ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL);
+ return &loadInfo;
}
};
struct ItemSparseLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2447,13 +2556,14 @@ struct ItemSparseLoadInfo
{ false, FT_BYTE, "ArtifactID" },
{ false, FT_BYTE, "RequiredExpansion" },
};
- return { &fields[0], std::extent::value, ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE);
+ return &loadInfo;
}
};
struct ItemSpecLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2465,13 +2575,14 @@ struct ItemSpecLoadInfo
{ false, FT_BYTE, "PrimaryStat" },
{ false, FT_BYTE, "SecondaryStat" },
};
- return { &fields[0], std::extent::value, ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC);
+ return &loadInfo;
}
};
struct ItemSpecOverrideLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2479,13 +2590,14 @@ struct ItemSpecOverrideLoadInfo
{ false, FT_INT, "ItemID" },
{ false, FT_SHORT, "SpecID" },
};
- return { &fields[0], std::extent::value, ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE);
+ return &loadInfo;
}
};
struct ItemUpgradeLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2496,13 +2608,14 @@ struct ItemUpgradeLoadInfo
{ false, FT_BYTE, "ItemUpgradePathID" },
{ false, FT_BYTE, "ItemLevelBonus" },
};
- return { &fields[0], std::extent::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE);
+ return &loadInfo;
}
};
struct ItemXBonusTreeLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2510,13 +2623,14 @@ struct ItemXBonusTreeLoadInfo
{ false, FT_INT, "ItemID" },
{ false, FT_SHORT, "BonusTreeID" },
};
- return { &fields[0], std::extent::value, ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE);
+ return &loadInfo;
}
};
struct KeyChainLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2554,13 +2668,14 @@ struct KeyChainLoadInfo
{ false, FT_BYTE, "Key31" },
{ false, FT_BYTE, "Key32" },
};
- return { &fields[0], std::extent::value, KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN);
+ return &loadInfo;
}
};
struct LfgDungeonsLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2597,13 +2712,14 @@ struct LfgDungeonsLoadInfo
{ false, FT_BYTE, "MentorCharLevel" },
{ false, FT_INT, "ID" },
};
- return { &fields[0], std::extent::value, LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent::value, LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS);
+ return &loadInfo;
}
};
struct LightLoadInfo
{
- static DB2LoadInfo Instance()
+ static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
@@ -2623,13 +2739,14 @@ struct LightLoadInfo
{ false, FT_SHORT, "LightParamsID7" },
{ false, FT_SHORT, "LightParamsID8" },
};
- return { &fields[0], std::extent