Core/DataStores: Updated db2 structures to 7.2.0

This commit is contained in:
Shauren
2017-04-06 23:39:34 +02:00
parent 886e9e839b
commit d20dedebd6
28 changed files with 2496 additions and 984 deletions
@@ -0,0 +1,311 @@
--
-- Table structure for table `achievement`
--
ALTER TABLE `achievement`
ADD `IconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`,
DROP `IconID`;
--
-- Table structure for table `artifact`
--
ALTER TABLE `artifact`
ADD `UiModelSceneID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Flags`,
ADD `SpellVisualKitID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `UiModelSceneID`;
--
-- Table structure for table `artifact_appearance`
--
ALTER TABLE `artifact_appearance` MODIFY `PlayerConditionID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`;
--
-- Table structure for table `artifact_power`
--
ALTER TABLE `artifact_power` ADD `ArtifactTier` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `MaxRank`;
--
-- Table structure for table `battlemaster_list`
--
ALTER TABLE `battlemaster_list`
ADD `ShortDescription` text NULL AFTER `GameType`,
ADD `LongDescription` text NULL AFTER `ShortDescription`;
--
-- Table structure for table `battlemaster_list_locale`
--
ALTER TABLE `battlemaster_list_locale`
ADD `ShortDescription_lang` text NULL AFTER `GameType_lang`,
ADD `LongDescription_lang` text NULL AFTER `ShortDescription_lang`;
--
-- Table structure for table `battle_pet_species`
--
ALTER TABLE `battle_pet_species`
ADD `CardModelSceneID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`,
ADD `LoadoutModelSceneID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `CardModelSceneID`;
--
-- Table structure for table `chr_races`
--
ALTER TABLE `chr_races`
DROP `ExplorationSoundID`,
DROP `UAMaleCreatureSoundDataID`,
DROP `UAFemaleCreatureSoundDataID`;
--
-- Table structure for table `chr_specialization`
--
ALTER TABLE `chr_specialization`
ADD `IconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`,
DROP `SpellIconID`;
--
-- Table structure for table `cinematic_camera`
--
ALTER TABLE `cinematic_camera`
MODIFY `SoundID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`,
ADD `ModelFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `OriginFacing`,
DROP `Model`;
--
-- Table structure for table `cinematic_sequences`
--
ALTER TABLE `cinematic_sequences` MODIFY `SoundID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`;
--
-- Table structure for table `creature_display_info`
--
ALTER TABLE `creature_display_info`
MODIFY `CreatureModelScale` float NOT NULL DEFAULT '0' AFTER `ID`,
MODIFY `ModelID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureModelScale`,
MODIFY `NPCSoundID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ModelID`,
MODIFY `SizeClass` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `NPCSoundID`,
MODIFY `Flags` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `SizeClass`,
MODIFY `Gender` tinyint(4) NOT NULL DEFAULT '0' AFTER `Flags`,
MODIFY `TextureVariation1` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ExtendedDisplayInfoID`,
MODIFY `TextureVariation2` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `TextureVariation1`,
MODIFY `TextureVariation3` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `TextureVariation2`,
ADD `PortraitTextureFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `TextureVariation3`,
MODIFY `CreatureModelAlpha` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `PortraitTextureFileDataID`,
MODIFY `SoundID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureModelAlpha`,
MODIFY `BloodID` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `PortraitCreatureDisplayInfoID`,
MODIFY `ParticleColorID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `BloodID`,
MODIFY `ObjectEffectPackageID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureGeosetData`,
MODIFY `AnimReplacementSetID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ObjectEffectPackageID`,
CHANGE `Unk700` `UnarmedWeaponSubclass` tinyint(4) NOT NULL DEFAULT '0' AFTER `AnimReplacementSetID`,
ADD `MountSpellVisualKitID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `InstanceOtherPlayerPetScale`,
DROP `PortraitTextureName`;
--
-- Table structure for table `creature_family`
--
ALTER TABLE `creature_family`
ADD `IconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Name`,
DROP `IconFile`;
--
-- Table structure for table `criteria_tree`
--
ALTER TABLE `criteria_tree` MODIFY `CriteriaID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Operator`;
--
-- Table structure for table `difficulty`
--
ALTER TABLE `difficulty`
MODIFY `GroupSizeHealthCurveID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `Name`,
MODIFY `GroupSizeDmgCurveID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `GroupSizeHealthCurveID`,
MODIFY `GroupSizeSpellPointsCurveID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `GroupSizeDmgCurveID`;
--
-- Table structure for table `dungeon_encounter`
--
ALTER TABLE `dungeon_encounter`
DROP `SpellIconID`,
MODIFY `ID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Flags`,
ADD `TextureFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `OrderIndex`;
--
-- Table structure for table `faction`
--
ALTER TABLE `faction` ADD `ParagonFactionID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ParentFactionID`;
--
-- Table structure for table `garr_class_spec`
--
ALTER TABLE `garr_class_spec` MODIFY `GarrFollItemSetID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `ClassAtlasID`;
--
-- Table structure for table `garr_follower`
--
ALTER TABLE `garr_follower` ADD `Name` text NULL AFTER `AllianceAddedBroadcastTextID`;
--
-- Table structure for table `garr_follower_locale`
--
ALTER TABLE `garr_follower_locale` ADD `Name_lang` text NULL AFTER `AllianceSourceText_lang`;
--
-- Table structure for table `garr_site_level`
--
ALTER TABLE `garr_site_level` MODIFY `MovieID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `SiteID`;
--
-- Table structure for table `holidays`
--
ALTER TABLE `holidays`
MODIFY `HolidayNameID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Flags`,
MODIFY `HolidayDescriptionID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `HolidayNameID`;
--
-- Table structure for table `item_bonus_tree_node`
--
ALTER TABLE `item_bonus_tree_node` ADD `ItemLevelSelectorID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `BonusListID`;
--
-- Table structure for table `item_sparse`
--
ALTER TABLE `item_sparse`
MODIFY `BuyCount` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Unk2`,
MODIFY `AllowableClass` smallint(6) NOT NULL DEFAULT '0' AFTER `StatScalingFactor`,
MODIFY `TotemCategory` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `Map`,
ADD `RequiredTransmogHolidayID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `HolidayID`;
--
-- Table structure for table `lfg_dungeons`
--
ALTER TABLE `lfg_dungeons` MODIFY `PlayerConditionID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `MentorItemLevel`;
--
-- Table structure for table `map`
--
ALTER TABLE `map`
ADD `ShortDescription` text NULL AFTER `MapDescription1`,
ADD `LongDescription` text NULL AFTER `ShortDescription`;
--
-- Table structure for table `map_locale`
--
ALTER TABLE `map_locale`
ADD `ShortDescription_lang` text NULL AFTER `MapDescription1_lang`,
ADD `LongDescription_lang` text NULL AFTER `ShortDescription_lang`;
--
-- Table structure for table `mount`
--
ALTER TABLE `mount`
DROP `DisplayId`,
MODIFY `PlayerConditionId` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`,
ADD `UiModelSceneID` int(11) NOT NULL DEFAULT '0' AFTER `PlayerConditionId`;
--
-- Table structure for table `mount_x_display`
--
DROP TABLE IF EXISTS `mount_x_display`;
CREATE TABLE `mount_x_display` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`MountID` int(10) unsigned NOT NULL DEFAULT '0',
`DisplayID` int(10) unsigned NOT NULL DEFAULT '0',
`PlayerConditionID` int(10) unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Table structure for table `player_condition`
--
ALTER TABLE `player_condition`
CHANGE `Unknown7001` `MovementFlags1` int(11) NOT NULL DEFAULT '0' AFTER `MaxAvgItemLevel`,
CHANGE `Unknown7002` `MovementFlags2` int(11) NOT NULL DEFAULT '0' AFTER `MovementFlags1`,
ADD `MainHandItemSubclassMask` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `MovementFlags2`;
--
-- Table structure for table `quest_package_item`
--
ALTER TABLE `quest_package_item` MODIFY `ItemCount` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `FilterType`;
--
-- Table structure for table `skill_line`
--
ALTER TABLE `skill_line`
ADD `IconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `CanLink`,
DROP `SpellIconID`;
--
-- Table structure for table `skill_line_ability`
--
ALTER TABLE `skill_line_ability` MODIFY `Unknown703` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `NumSkillUps`;
--
-- Table structure for table `spell_duration`
--
ALTER TABLE `spell_duration` MODIFY `DurationPerLevel` int(11) NOT NULL DEFAULT '0' AFTER `MaxDuration`;
--
-- Table structure for table `spell_effect`
--
ALTER TABLE `spell_effect`
MODIFY `EffectSpellClassMask1` int(10) UNSIGNED NOT NULL DEFAULT '0' FIRST,
MODIFY `EffectSpellClassMask2` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask1`,
MODIFY `EffectSpellClassMask3` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask2`,
MODIFY `EffectSpellClassMask4` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask3`,
MODIFY `ID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectSpellClassMask4`,
MODIFY `SpellID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ID`,
MODIFY `Effect` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `SpellID`,
MODIFY `EffectAura` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `Effect`,
MODIFY `EffectBasePoints` int(11) NOT NULL DEFAULT '0' AFTER `EffectAura`,
MODIFY `EffectIndex` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectBasePoints`,
MODIFY `EffectMiscValue` int(11) NOT NULL DEFAULT '0' AFTER `EffectIndex`,
MODIFY `EffectMiscValueB` int(11) NOT NULL DEFAULT '0' AFTER `EffectMiscValue`,
MODIFY `EffectRadiusIndex` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectMiscValueB`,
MODIFY `EffectRadiusMaxIndex` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectRadiusIndex`,
MODIFY `ImplicitTarget1` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectRadiusMaxIndex`,
MODIFY `ImplicitTarget2` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ImplicitTarget1`,
MODIFY `DifficultyID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `ImplicitTarget2`,
MODIFY `EffectAuraPeriod` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectAmplitude`,
MODIFY `EffectChainTargets` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectChainAmplitude`,
MODIFY `EffectDieSides` int(11) NOT NULL DEFAULT '0' AFTER `EffectChainTargets`,
MODIFY `EffectItemType` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectDieSides`,
MODIFY `EffectMechanic` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectItemType`,
MODIFY `EffectTriggerSpell` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectRealPointsPerLevel`,
MODIFY `EffectAttributes` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `EffectPosFacing`,
ADD `PvPMultiplier` float NOT NULL DEFAULT '0' AFTER `BonusCoefficientFromAP`;
--
-- Table structure for table `spell_misc`
--
ALTER TABLE `spell_misc`
ADD `IconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `SchoolMask`,
ADD `ActiveIconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `IconFileDataID`,
DROP `SpellIconID`,
DROP `ActiveIconID`;
--
-- Table structure for table `spell_shapeshift_form`
--
ALTER TABLE `spell_shapeshift_form`
ADD `AttackIconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `BonusActionBar`,
MODIFY `CreatureDisplayID1` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `AttackIconFileDataID`,
MODIFY `CreatureDisplayID2` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureDisplayID1`,
MODIFY `CreatureDisplayID3` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureDisplayID2`,
MODIFY `CreatureDisplayID4` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureDisplayID3`,
MODIFY `PresetSpellID1` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `CreatureDisplayID4`,
MODIFY `PresetSpellID2` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID1`,
MODIFY `PresetSpellID3` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID2`,
MODIFY `PresetSpellID4` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID3`,
MODIFY `PresetSpellID5` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID4`,
MODIFY `PresetSpellID6` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID5`,
MODIFY `PresetSpellID7` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID6`,
MODIFY `PresetSpellID8` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `PresetSpellID7`,
DROP `AttackIconID`;
--
-- Table structure for table `spell_x_spell_visual`
--
ALTER TABLE `spell_x_spell_visual`
CHANGE `SpellVisualID1` `SpellVisualID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `SpellID`,
MODIFY `ID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `SpellVisualID`,
CHANGE `PlayerConditionID` `CasterPlayerConditionID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `Chance`,
ADD `CasterUnitConditionID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `CasterPlayerConditionID`,
ADD `PlayerConditionID` smallint(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `CasterUnitConditionID`,
ADD `IconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `UnitConditionID`,
ADD `ActiveIconFileDataID` int(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `IconFileDataID`,
DROP `SpellVisualID2`;
+159 -7
View File
@@ -37,8 +37,8 @@ DB2FileLoadInfo::DB2FileLoadInfo(DB2FieldMeta const* fields, std::size_t fieldCo
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))
for (char fieldType : TypesString)
if (fieldType == FT_STRING || (fieldType == FT_STRING_NOT_LOCALIZED && !localizedOnly))
++stringFields;
return stringFields;
@@ -93,6 +93,7 @@ public:
uint32 GetMaxId() const override;
private:
void FillCommonValues(char** indexTable);
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;
@@ -126,6 +127,7 @@ private:
uint32 idTableSize;
DB2RecordCopy* copyTable;
FieldEntry* fields;
unsigned char* commonData;
};
class DB2FileLoaderSparseImpl final : public DB2FileLoaderImpl
@@ -196,6 +198,7 @@ DB2FileLoaderRegularImpl::DB2FileLoaderRegularImpl()
idTableSize = 0;
copyTable = nullptr;
fields = nullptr;
commonData = nullptr;
}
bool DB2FileLoaderRegularImpl::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo, DB2Header const* header)
@@ -232,6 +235,20 @@ bool DB2FileLoaderRegularImpl::Load(DB2FileSource* source, DB2FileLoadInfo const
return false;
}
if (header->CommonDataSize)
{
uint32 commonFieldCount;
if (!source->Read(&commonFieldCount, sizeof(uint32)))
return false;
if (commonFieldCount != header->TotalFieldCount)
return false;
commonData = new unsigned char[header->CommonDataSize - sizeof(uint32)];
if (!source->Read(commonData, header->CommonDataSize - sizeof(uint32)))
return false;
}
return true;
}
@@ -241,13 +258,14 @@ DB2FileLoaderRegularImpl::~DB2FileLoaderRegularImpl()
delete[] idTable;
delete[] copyTable;
delete[] fields;
delete[] commonData;
}
static char const* const nullStr = "";
char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTable, std::vector<char*>& stringPool)
{
if (_loadInfo->Meta->FieldCount != _header->FieldCount)
if (_loadInfo->Meta->FieldCount != _header->TotalFieldCount)
return nullptr;
//get struct size and index pos
@@ -347,14 +365,61 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa
++fieldIndex;
}
}
for (uint32 x = _header->FieldCount; x < _header->TotalFieldCount; ++x)
{
for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z)
{
switch (_loadInfo->TypesString[fieldIndex])
{
case FT_FLOAT:
*((float*)(&dataTable[offset])) = _loadInfo->Meta->FieldDefaults[x].AsFloat;
offset += 4;
break;
case FT_INT:
*((uint32*)(&dataTable[offset])) = _loadInfo->Meta->FieldDefaults[x].AsUInt32;
offset += 4;
break;
case FT_BYTE:
*((uint8*)(&dataTable[offset])) = _loadInfo->Meta->FieldDefaults[x].AsUInt8;
offset += 1;
break;
case FT_SHORT:
*((uint16*)(&dataTable[offset])) = _loadInfo->Meta->FieldDefaults[x].AsUInt16;
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;
}
}
}
if (commonData)
FillCommonValues(indexTable);
return dataTable;
}
char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 locale)
{
if (_loadInfo->Meta->FieldCount != _header->FieldCount)
if (_loadInfo->Meta->FieldCount != _header->TotalFieldCount)
return nullptr;
if (!(_header->Locale & (1 << locale)))
@@ -389,7 +454,7 @@ char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 local
++fieldIndex;
}
for (uint32 x = 0; x < _header->FieldCount; ++x)
for (uint32 x = 0; x < _header->TotalFieldCount; ++x)
{
for (uint32 z = 0; z < _loadInfo->Meta->ArraySizes[x]; ++z)
{
@@ -460,6 +525,91 @@ void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** in
}
}
void DB2FileLoaderRegularImpl::FillCommonValues(char** indexTable)
{
uint32 fieldOffset = 0;
if (!_loadInfo->Meta->HasIndexFieldInData())
fieldOffset += 4;
unsigned char* commonDataItr = commonData;
for (uint32 field = 0; field < _header->TotalFieldCount; ++field)
{
uint32 numExtraValuesForField = *reinterpret_cast<uint32*>(commonDataItr);
commonDataItr += sizeof(uint32);
uint8 dataType = *reinterpret_cast<uint8*>(commonDataItr);
commonDataItr += sizeof(uint8);
for (uint32 record = 0; record < numExtraValuesForField; ++record)
{
uint32 recordId = *reinterpret_cast<uint32*>(commonDataItr);
commonDataItr += sizeof(uint32);
char* recordData = indexTable[recordId];
switch (dataType)
{
case 1:
{
ASSERT(_loadInfo->Meta->Types[field] == FT_SHORT);
uint16 value = *reinterpret_cast<uint16*>(commonDataItr);
EndianConvert(value);
commonDataItr += sizeof(uint16);
for (uint32 arrayIndex = 0; arrayIndex < _loadInfo->Meta->ArraySizes[field]; ++arrayIndex)
*reinterpret_cast<uint16*>(&recordData[fieldOffset + sizeof(uint16) * arrayIndex]) = value;
break;
}
case 2:
{
ASSERT(_loadInfo->Meta->Types[field] == FT_BYTE);
uint8 value = *reinterpret_cast<uint8*>(commonDataItr);
commonDataItr += sizeof(uint8);
for (uint32 arrayIndex = 0; arrayIndex < _loadInfo->Meta->ArraySizes[field]; ++arrayIndex)
*reinterpret_cast<uint8*>(&recordData[fieldOffset + sizeof(uint8) * arrayIndex]) = value;
break;
}
case 3:
{
ASSERT(_loadInfo->Meta->Types[field] == FT_FLOAT);
float value = *reinterpret_cast<float*>(commonDataItr);
EndianConvert(value);
commonDataItr += sizeof(float);
for (uint32 arrayIndex = 0; arrayIndex < _loadInfo->Meta->ArraySizes[field]; ++arrayIndex)
*reinterpret_cast<float*>(&recordData[fieldOffset + sizeof(float) * arrayIndex]) = value;
break;
}
case 4:
{
ASSERT(_loadInfo->Meta->Types[field] == FT_INT);
uint32 value = *reinterpret_cast<uint32*>(commonDataItr);
EndianConvert(value);
commonDataItr += sizeof(uint32);
for (uint32 arrayIndex = 0; arrayIndex < _loadInfo->Meta->ArraySizes[field]; ++arrayIndex)
*reinterpret_cast<uint32*>(&recordData[fieldOffset + sizeof(uint32) * arrayIndex]) = value;
break;
}
default:
break;
}
}
switch (_loadInfo->Meta->Types[field])
{
case FT_FLOAT:
case FT_INT:
fieldOffset += 4 * _loadInfo->Meta->ArraySizes[field];
break;
case FT_BYTE:
fieldOffset += 1 * _loadInfo->Meta->ArraySizes[field];
break;
case FT_SHORT:
fieldOffset += 2 * _loadInfo->Meta->ArraySizes[field];
break;
case FT_STRING:
fieldOffset += sizeof(char*) * _loadInfo->Meta->ArraySizes[field];
break;
}
}
}
DB2Record DB2FileLoaderRegularImpl::GetRecord(uint32 recordNumber) const
{
return DB2Record(*this, recordNumber, nullptr);
@@ -642,7 +792,7 @@ bool DB2FileLoaderSparseImpl::Load(DB2FileSource* source, DB2FileLoadInfo const*
char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable, std::vector<char*>& stringPool)
{
if (_loadInfo->Meta->FieldCount != _header->FieldCount)
return NULL;
return nullptr;
//get struct size and index pos
uint32 recordsize = _loadInfo->Meta->GetRecordSize();
@@ -1100,8 +1250,10 @@ bool DB2FileLoader::Load(DB2FileSource* source, DB2FileLoadInfo const* loadInfo)
EndianConvert(_header.CopyTableSize);
EndianConvert(_header.Flags);
EndianConvert(_header.IndexField);
EndianConvert(_header.TotalFieldCount);
EndianConvert(_header.CommonDataSize);
if (_header.Signature != 0x35424457) //'WDB5'
if (_header.Signature != 0x36424457) //'WDB6'
return false;
if (_header.LayoutHash != loadInfo->Meta->LayoutHash)
+3 -1
View File
@@ -42,6 +42,8 @@ struct DB2Header
uint32 CopyTableSize;
uint16 Flags;
int16 IndexField;
uint32 TotalFieldCount;
uint32 CommonDataSize;
};
#pragma pack(pop)
@@ -123,7 +125,7 @@ public:
char* AutoProduceStrings(char* dataTable, uint32 locale);
void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable);
uint32 GetCols() const { return _header.FieldCount; }
uint32 GetCols() const { return _header.TotalFieldCount; }
uint32 GetRecordCount() const;
uint32 GetRecordCopyCount() const;
uint32 GetTableHash() const { return _header.TableHash; }
+27 -2
View File
@@ -18,8 +18,33 @@
#include "DB2Meta.h"
#include "Errors.h"
DB2Meta::DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes)
: IndexField(indexField), FieldCount(fieldCount), LayoutHash(layoutHash), Types(types), ArraySizes(arraySizes)
DB2FieldDefault::DB2FieldDefault(uint8 u8)
{
AsUInt8 = u8;
}
DB2FieldDefault::DB2FieldDefault(uint16 u16)
{
AsUInt16 = u16;
}
DB2FieldDefault::DB2FieldDefault(uint32 u32)
{
AsUInt32 = u32;
}
DB2FieldDefault::DB2FieldDefault(float f)
{
AsFloat = f;
}
DB2FieldDefault::DB2FieldDefault(char const* str)
{
AsString = str;
}
DB2Meta::DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes, DB2FieldDefault const* fieldDefaults)
: IndexField(indexField), FieldCount(fieldCount), LayoutHash(layoutHash), Types(types), ArraySizes(arraySizes), FieldDefaults(fieldDefaults)
{
}
+20 -1
View File
@@ -20,9 +20,27 @@
#include "Define.h"
struct TC_COMMON_API DB2FieldDefault
{
DB2FieldDefault(uint8 u8);
DB2FieldDefault(uint16 u16);
DB2FieldDefault(uint32 u32);
DB2FieldDefault(float f);
DB2FieldDefault(char const* str);
union
{
uint8 AsUInt8;
uint16 AsUInt16;
uint32 AsUInt32;
float AsFloat;
char const* AsString;
};
};
struct TC_COMMON_API DB2Meta
{
DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes);
DB2Meta(int32 indexField, uint32 fieldCount, uint32 layoutHash, char const* types, uint8 const* arraySizes, DB2FieldDefault const* fieldDefaults);
bool HasIndexFieldInData() const;
@@ -40,6 +58,7 @@ struct TC_COMMON_API DB2Meta
uint32 LayoutHash;
char const* Types;
uint8 const* ArraySizes;
DB2FieldDefault const* FieldDefaults;
};
struct TC_COMMON_API DB2FieldMeta
@@ -31,8 +31,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS);
// Achievement.db2
PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT Title, Description, Flags, Reward, MapID, Supercedes, Category, UIOrder, IconID, SharesCriteria, "
"CriteriaTree, Faction, Points, MinimumCriteria, ID FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT Title, Description, Flags, Reward, MapID, Supercedes, Category, UIOrder, SharesCriteria, "
"CriteriaTree, Faction, Points, MinimumCriteria, ID, IconFileDataID FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title_lang, Description_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH);
// AnimKit.db2
@@ -57,12 +57,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// Artifact.db2
PrepareStatement(HOTFIX_SEL_ARTIFACT, "SELECT ID, Name, BarConnectedColor, BarDisconnectedColor, TitleColor, ClassUiTextureKitID, SpecID, "
"ArtifactCategoryID, Flags FROM artifact ORDER BY ID DESC", CONNECTION_SYNCH);
"ArtifactCategoryID, Flags, UiModelSceneID, SpellVisualKitID FROM artifact ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ARTIFACT, "SELECT ID, Name_lang FROM artifact_locale WHERE locale = ?", CONNECTION_SYNCH);
// ArtifactAppearance.db2
PrepareStatement(HOTFIX_SEL_ARTIFACT_APPEARANCE, "SELECT Name, SwatchColor, ModelDesaturation, ModelAlpha, ShapeshiftDisplayID, "
"ArtifactAppearanceSetID, PlayerConditionID, Unknown, DisplayIndex, AppearanceModID, Flags, ModifiesShapeshiftFormDisplay, ID, "
"ArtifactAppearanceSetID, Unknown, DisplayIndex, AppearanceModID, Flags, ModifiesShapeshiftFormDisplay, ID, PlayerConditionID, "
"ItemAppearanceID, AltItemAppearanceID FROM artifact_appearance ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ARTIFACT_APPEARANCE, "SELECT ID, Name_lang FROM artifact_appearance_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -76,7 +76,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" ORDER BY ID DESC", CONNECTION_SYNCH);
// ArtifactPower.db2
PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER, "SELECT PosX, PosY, ArtifactID, Flags, MaxRank, ID, RelicType FROM artifact_power ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER, "SELECT PosX, PosY, ArtifactID, Flags, MaxRank, ArtifactTier, ID, RelicType FROM artifact_power"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// ArtifactPowerLink.db2
PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER_LINK, "SELECT ID, FromArtifactPowerID, ToArtifactPowerID FROM artifact_power_link ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -112,17 +113,19 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// BattlePetSpecies.db2
PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT CreatureID, IconFileID, SummonSpellID, SourceText, Description, Flags, PetType, Source, "
"ID FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH);
"ID, CardModelSceneID, LoadoutModelSceneID FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, SourceText_lang, Description_lang FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH);
// BattlePetSpeciesState.db2
PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, Value, SpeciesID, State FROM battle_pet_species_state ORDER BY ID DESC", CONNECTION_SYNCH);
// BattlemasterList.db2
PrepareStatement(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name, IconFileDataID, GameType, MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, "
"MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16, HolidayWorldState, PlayerConditionID, InstanceType, "
"GroupsAllowed, MaxGroupSize, MinLevel, MaxLevel, RatedPlayers, MinPlayers, MaxPlayers, Flags FROM battlemaster_list ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name_lang, GameType_lang FROM battlemaster_list_locale WHERE locale = ?", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name, IconFileDataID, GameType, ShortDescription, LongDescription, MapID1, MapID2, "
"MapID3, MapID4, MapID5, MapID6, MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16, HolidayWorldState, "
"PlayerConditionID, InstanceType, GroupsAllowed, MaxGroupSize, MinLevel, MaxLevel, RatedPlayers, MinPlayers, MaxPlayers, Flags"
" FROM battlemaster_list ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang"
" FROM battlemaster_list_locale WHERE locale = ?", CONNECTION_SYNCH);
// BroadcastText.db2
PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, "
@@ -159,20 +162,19 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ID, Flags, ClientPrefix, ClientFileString, Name, NameFemale, NameMale, FacialHairCustomization1, "
"FacialHairCustomization2, HairCustomization, CreateScreenFileDataID, SelectScreenFileDataID, MaleCustomizeOffset1, MaleCustomizeOffset2, "
"MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, FactionID, "
"ExplorationSoundID, MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, UAMaleCreatureSoundDataID, "
"UAFemaleCreatureSoundDataID, BaseLanguage, CreatureType, TeamID, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, "
"DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, CharComponentTexLayoutHiResID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk1, "
"Unk2, Unk3 FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH);
"MaleDisplayID, FemaleDisplayID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, BaseLanguage, CreatureType, TeamID, RaceRelated, "
"UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, ItemAppearanceFrameRaceID, "
"CharComponentTexLayoutHiResID, HighResMaleDisplayID, HighResFemaleDisplayID, Unk1, Unk2, Unk3 FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH);
// ChrSpecialization.db2
PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT MasterySpellID1, MasterySpellID2, Name, Name2, Description, SpellIconID, ClassID, "
"OrderIndex, PetTalentType, Role, PrimaryStatOrder, ID, Flags, AnimReplacementSetID FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT MasterySpellID1, MasterySpellID2, Name, Name2, Description, ClassID, OrderIndex, "
"PetTalentType, Role, PrimaryStatOrder, ID, IconFileDataID, Flags, AnimReplacementSetID FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, Name_lang, Name2_lang, Description_lang FROM chr_specialization_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
// CinematicCamera.db2
PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, Model, OriginX, OriginY, OriginZ, OriginFacing, SoundID FROM cinematic_camera"
PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, SoundID, OriginX, OriginY, OriginZ, OriginFacing, ModelFileDataID FROM cinematic_camera"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// CinematicSequences.db2
@@ -180,10 +182,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM cinematic_sequences ORDER BY ID DESC", CONNECTION_SYNCH);
// CreatureDisplayInfo.db2
PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ExtendedDisplayInfoID, CreatureModelScale, PlayerModelScale, TextureVariation1, "
"TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, CreatureGeosetData, StateSpellVisualKitID, "
"InstanceOtherPlayerPetScale, ModelID, SoundID, NPCSoundID, ParticleColorID, ObjectEffectPackageID, AnimReplacementSetID, CreatureModelAlpha, "
"SizeClass, BloodID, Flags, Gender, Unk700 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, CreatureModelScale, ModelID, NPCSoundID, SizeClass, Flags, Gender, "
"ExtendedDisplayInfoID, TextureVariation1, TextureVariation2, TextureVariation3, PortraitTextureFileDataID, CreatureModelAlpha, SoundID, "
"PlayerModelScale, PortraitCreatureDisplayInfoID, BloodID, ParticleColorID, CreatureGeosetData, ObjectEffectPackageID, AnimReplacementSetID, "
"UnarmedWeaponSubclass, StateSpellVisualKitID, InstanceOtherPlayerPetScale, MountSpellVisualKitID FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH);
// CreatureDisplayInfoExtra.db2
PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, FileDataID, HDFileDataID, DisplayRaceID, DisplaySexID, DisplayClassID, "
@@ -191,8 +193,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH);
// CreatureFamily.db2
PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, MinScale, MaxScale, Name, IconFile, SkillLine1, SkillLine2, PetFoodMask, MinScaleLevel, "
"MaxScaleLevel, PetTalentType FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, MinScale, MaxScale, Name, IconFileDataID, SkillLine1, SkillLine2, PetFoodMask, "
"MinScaleLevel, MaxScaleLevel, PetTalentType FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH);
// CreatureModelData.db2
@@ -211,7 +213,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"StartEvent, FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH);
// CriteriaTree.db2
PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, CriteriaID, Amount, Description, Parent, Flags, Operator, OrderIndex FROM criteria_tree"
PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Amount, Description, Parent, Flags, Operator, CriteriaID, OrderIndex FROM criteria_tree"
" ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -235,14 +237,14 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH);
// Difficulty.db2
PrepareStatement(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name, FallbackDifficultyID, InstanceType, MinPlayers, MaxPlayers, OldEnumValue, Flags, "
"ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID, ItemBonusTreeModID, OrderIndex FROM difficulty"
" ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID, "
"FallbackDifficultyID, InstanceType, MinPlayers, MaxPlayers, OldEnumValue, Flags, ToggleDifficultyID, ItemBonusTreeModID, OrderIndex"
" FROM difficulty ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?", CONNECTION_SYNCH);
// DungeonEncounter.db2
PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name, CreatureDisplayID, MapID, SpellIconID, DifficultyID, Bit, Flags, OrderIndex"
" FROM dungeon_encounter ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT Name, CreatureDisplayID, MapID, DifficultyID, Bit, Flags, ID, OrderIndex, "
"TextureFileDataID FROM dungeon_encounter ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?", CONNECTION_SYNCH);
// DurabilityCosts.db2
@@ -272,7 +274,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ParentFactionModIn, ParentFactionModOut, Name, Description, "
"ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, ReputationIndex, ReputationClassMask1, ReputationClassMask2, "
"ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, ParentFactionID, "
"ParentFactionCapIn, ParentFactionCapOut, Expansion, Flags, FriendshipRepID FROM faction ORDER BY ID DESC", CONNECTION_SYNCH);
"ParagonFactionID, ParentFactionCapIn, ParentFactionCapOut, Expansion, Flags, FriendshipRepID FROM faction ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_FACTION, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE locale = ?", CONNECTION_SYNCH);
// FactionTemplate.db2
@@ -314,11 +316,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// GarrFollower.db2
PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT HordeCreatureID, AllianceCreatureID, HordeSourceText, AllianceSourceText, HordePortraitIconID, "
"AlliancePortraitIconID, HordeAddedBroadcastTextID, AllianceAddedBroadcastTextID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, "
"AlliancePortraitIconID, HordeAddedBroadcastTextID, AllianceAddedBroadcastTextID, Name, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, "
"ItemLevelWeapon, ItemLevelArmor, HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID, FollowerTypeID, HordeUiAnimRaceInfoID, "
"AllianceUiAnimRaceInfoID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, Level, Unknown1, Flags, Unknown2, Unknown3, GarrTypeID, "
"MaxDurability, Class, HordeFlavorTextGarrStringID, AllianceFlavorTextGarrStringID, ID FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, Name_lang FROM garr_follower_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
// GarrFollowerXAbility.db2
PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, GarrFollowerID, GarrAbilityID, FactionIndex FROM garr_follower_x_ability"
@@ -337,8 +340,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name_lang FROM garr_plot_instance_locale WHERE locale = ?", CONNECTION_SYNCH);
// GarrSiteLevel.db2
PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallX, TownHallY, MapID, SiteID, UpgradeResourceCost, UpgradeMoneyCost, Level, "
"UITextureKitID, MovieID, Level2 FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallX, TownHallY, MapID, SiteID, MovieID, UpgradeResourceCost, UpgradeMoneyCost, "
"Level, UITextureKitID, Level2 FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH);
// GarrSiteLevelPlotInst.db2
PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, LandmarkX, LandmarkY, GarrSiteLevelID, GarrPlotInstanceID, Unknown"
@@ -378,7 +381,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, "
"Date14, Date15, Date16, TextureFilename, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, "
"Duration10, Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, "
"CalendarFlags8, CalendarFlags9, CalendarFlags10, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags FROM holidays"
"CalendarFlags8, CalendarFlags9, CalendarFlags10, Priority, CalendarFilterType, Flags, HolidayNameID, HolidayDescriptionID FROM holidays"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// ImportPriceArmor.db2
@@ -424,8 +427,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA, "SELECT Delta, ID FROM item_bonus_list_level_delta ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemBonusTreeNode.db2
PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, SubTreeID, BonusListID, BonusTreeModID FROM item_bonus_tree_node"
" ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, SubTreeID, BonusListID, ItemLevelSelectorID, BonusTreeModID"
" FROM item_bonus_tree_node ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemChildEquipment.db2
PrepareStatement(HOTFIX_SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ItemID, AltItemID, AltEquipmentSlot FROM item_child_equipment ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -509,20 +512,20 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, SpellID, ItemSetID, ChrSpecID, Threshold FROM item_set_spell ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemSparse.db2
PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Flags1, Flags2, Flags3, Unk1, Unk2, BuyPrice, SellPrice, AllowableClass, AllowableRace, "
PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Flags1, Flags2, Flags3, Unk1, Unk2, BuyCount, BuyPrice, SellPrice, AllowableRace, "
"RequiredSpell, MaxCount, Stackable, ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, "
"ItemStatAllocation6, ItemStatAllocation7, ItemStatAllocation8, ItemStatAllocation9, ItemStatAllocation10, ItemStatSocketCostMultiplier1, "
"ItemStatSocketCostMultiplier2, ItemStatSocketCostMultiplier3, ItemStatSocketCostMultiplier4, ItemStatSocketCostMultiplier5, "
"ItemStatSocketCostMultiplier6, ItemStatSocketCostMultiplier7, ItemStatSocketCostMultiplier8, ItemStatSocketCostMultiplier9, "
"ItemStatSocketCostMultiplier10, RangedModRange, Name, Name2, Name3, Name4, Description, BagFamily, ArmorDamageModifier, Duration, "
"StatScalingFactor, ItemLevel, RequiredSkill, RequiredSkillRank, RequiredReputationFaction, ItemStatValue1, ItemStatValue2, ItemStatValue3, "
"ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, ItemStatValue10, ScalingStatDistribution, "
"Delay, PageText, StartQuest, LockID, RandomProperty, RandomSuffix, ItemSet, Area, Map, SocketBonus, GemProperties, ItemLimitCategory, "
"HolidayID, ItemNameDescriptionID, Quality, BuyCount, InventoryType, RequiredLevel, RequiredHonorRank, RequiredCityRank, "
"RequiredReputationRank, ContainerSlots, ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, "
"ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, DamageType, Bonding, LanguageID, PageMaterial, Material, Sheath, TotemCategory, "
"SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID, RequiredExpansion FROM item_sparse"
" ORDER BY ID DESC", CONNECTION_SYNCH);
"StatScalingFactor, AllowableClass, ItemLevel, RequiredSkill, RequiredSkillRank, RequiredReputationFaction, ItemStatValue1, ItemStatValue2, "
"ItemStatValue3, ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, ItemStatValue10, "
"ScalingStatDistribution, Delay, PageText, StartQuest, LockID, RandomProperty, RandomSuffix, ItemSet, Area, Map, TotemCategory, SocketBonus, "
"GemProperties, ItemLimitCategory, HolidayID, RequiredTransmogHolidayID, ItemNameDescriptionID, Quality, InventoryType, RequiredLevel, "
"RequiredHonorRank, RequiredCityRank, RequiredReputationRank, ContainerSlots, ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, "
"ItemStatType5, ItemStatType6, ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, DamageType, Bonding, LanguageID, PageMaterial, "
"Material, Sheath, SocketColor1, SocketColor2, SocketColor3, CurrencySubstitutionID, CurrencySubstitutionCount, ArtifactID, "
"RequiredExpansion FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
@@ -546,8 +549,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" ORDER BY ID DESC", CONNECTION_SYNCH);
// LfgDungeons.db2
PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT Name, Flags, TextureFilename, Description, PlayerConditionID, MinItemLevel, MaxLevel, "
"TargetLevelMax, MapID, RandomID, ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, MinLevel, TargetLevel, "
PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT Name, Flags, TextureFilename, Description, MinItemLevel, MaxLevel, TargetLevelMax, MapID, "
"RandomID, ScenarioID, LastBossJournalEncounterID, BonusReputationAmount, MentorItemLevel, PlayerConditionID, MinLevel, TargetLevel, "
"TargetLevelMin, DifficultyID, Type, Faction, Expansion, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, "
"MinCountHealer, MinCountDamage, SubType, MentorCharLevel, ID FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?", CONNECTION_SYNCH);
@@ -575,9 +578,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// Map.db2
PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, Flags1, Flags2, MinimapIconScale, CorpsePosX, CorpsePosY, MapName, MapDescription0, "
"MapDescription1, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, WindSettingsID, "
"InstanceType, unk5, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH);
"MapDescription1, ShortDescription, LongDescription, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, "
"CosmeticParentMapID, WindSettingsID, InstanceType, unk5, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, ShortDescription_lang, "
"LongDescription_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH);
// MapDifficulty.db2
PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, MapID, DifficultyID, RaidDurationType, MaxPlayers, LockID, ItemBonusTreeModID, "
@@ -588,8 +592,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset1, Asset2, Parent, Type, Unk700, Operator, Amount FROM modifier_tree ORDER BY ID DESC", CONNECTION_SYNCH);
// Mount.db2
PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT SpellId, DisplayId, Name, Description, SourceDescription, CameraPivotMultiplier, MountTypeId, Flags, "
"PlayerConditionId, Source, ID FROM mount ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT SpellId, Name, Description, SourceDescription, CameraPivotMultiplier, MountTypeId, Flags, Source, ID, "
"PlayerConditionId, UiModelSceneID FROM mount ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH);
// MountCapability.db2
@@ -600,6 +604,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// MountXDisplay.db2
PrepareStatement(HOTFIX_SEL_MOUNT_X_DISPLAY, "SELECT ID, MountID, DisplayID, PlayerConditionID FROM mount_x_display ORDER BY ID DESC", CONNECTION_SYNCH);
// Movie.db2
PrepareStatement(HOTFIX_SEL_MOVIE, "SELECT ID, AudioFileDataID, SubtitleFileDataID, Volume, KeyID FROM movie ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -642,7 +649,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"MinFactionID2, MinFactionID3, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, "
"ItemCount3, ItemCount4, LfgLogic, LfgValue1, LfgValue2, LfgValue3, LfgValue4, CurrencyLogic, CurrencyID1, CurrencyID2, CurrencyID3, "
"CurrencyID4, QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, PhaseGroupID, "
"MinAvgItemLevel, MaxAvgItemLevel, Unknown7001, Unknown7002 FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH);
"MinAvgItemLevel, MaxAvgItemLevel, MovementFlags1, MovementFlags2, MainHandItemSubclassMask FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?", CONNECTION_SYNCH);
// PowerDisplay.db2
@@ -665,7 +672,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM quest_money_reward ORDER BY ID DESC", CONNECTION_SYNCH);
// QuestPackageItem.db2
PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, QuestPackageID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, QuestPackageID, FilterType, ItemCount FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH);
// QuestSort.db2
PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName, SortOrder FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -706,14 +713,14 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_SCENE_SCRIPT_PACKAGE, "SELECT ID, Name FROM scene_script_package ORDER BY ID DESC", CONNECTION_SYNCH);
// SkillLine.db2
PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName, Description, AlternateVerb, SpellIconID, Flags, CategoryID, CanLink, "
PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName, Description, AlternateVerb, Flags, CategoryID, CanLink, IconFileDataID, "
"ParentSkillLineID FROM skill_line ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName_lang, Description_lang, AlternateVerb_lang FROM skill_line_locale"
" WHERE locale = ?", CONNECTION_SYNCH);
// SkillLineAbility.db2
PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, SupercedesSpell, Unknown703, SkillLine, MinSkillLineRank, "
"TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AcquireMethod, NumSkillUps, ClassMask"
PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, SupercedesSpell, SkillLine, MinSkillLineRank, "
"TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AcquireMethod, NumSkillUps, Unknown703, ClassMask"
" FROM skill_line_ability ORDER BY ID DESC", CONNECTION_SYNCH);
// SkillRaceClassInfo.db2
@@ -774,11 +781,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration, DurationPerLevel FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellEffect.db2
PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT EffectAmplitude, EffectBonusCoefficient, EffectChainAmplitude, EffectPointsPerResource, "
"EffectRealPointsPerLevel, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, EffectPosFacing, "
"BonusCoefficientFromAP, ID, DifficultyID, Effect, EffectAura, EffectAuraPeriod, EffectBasePoints, EffectChainTargets, EffectDieSides, "
"EffectItemType, EffectMechanic, EffectMiscValue, EffectMiscValueB, EffectRadiusIndex, EffectRadiusMaxIndex, EffectTriggerSpell, "
"ImplicitTarget1, ImplicitTarget2, SpellID, EffectIndex, EffectAttributes FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ID, "
"SpellID, Effect, EffectAura, EffectBasePoints, EffectIndex, EffectMiscValue, EffectMiscValueB, EffectRadiusIndex, EffectRadiusMaxIndex, "
"ImplicitTarget1, ImplicitTarget2, DifficultyID, EffectAmplitude, EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, "
"EffectChainTargets, EffectDieSides, EffectItemType, EffectMechanic, EffectPointsPerResource, EffectRealPointsPerLevel, EffectTriggerSpell, "
"EffectPosFacing, EffectAttributes, BonusCoefficientFromAP, PvPMultiplier FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellEffectScaling.db2
PrepareStatement(HOTFIX_SEL_SPELL_EFFECT_SCALING, "SELECT ID, Coefficient, Variance, ResourceCoefficient, SpellEffectID FROM spell_effect_scaling"
@@ -819,7 +826,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SpellMisc.db2
PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, Attributes, AttributesEx, AttributesExB, AttributesExC, AttributesExD, AttributesExE, "
"AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, Speed, "
"MultistrikeSpeedMod, CastingTimeIndex, DurationIndex, RangeIndex, SpellIconID, ActiveIconID, SchoolMask FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH);
"MultistrikeSpeedMod, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, IconFileDataID, ActiveIconFileDataID FROM spell_misc"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellPower.db2
PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT SpellID, ManaCost, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, "
@@ -858,10 +866,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"StanceBarOrder FROM spell_shapeshift ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellShapeshiftForm.db2
PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, WeaponDamageVariance, Flags, AttackIconID, CombatRoundTime, "
"CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, PresetSpellID3, "
"PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8, MountTypeID, CreatureType, BonusActionBar"
" FROM spell_shapeshift_form ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, WeaponDamageVariance, Flags, CombatRoundTime, MountTypeID, CreatureType, "
"BonusActionBar, AttackIconFileDataID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, "
"PresetSpellID2, PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form"
" ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE locale = ?", CONNECTION_SYNCH);
// SpellTargetRestrictions.db2
@@ -873,8 +881,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" FROM spell_totems ORDER BY ID DESC", CONNECTION_SYNCH);
// SpellXSpellVisual.db2
PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT SpellID, Chance, SpellVisualID1, SpellVisualID2, PlayerConditionID, UnitConditionID, "
"Flags, DifficultyID, Priority, ID FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH);
PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT SpellID, SpellVisualID, ID, Chance, CasterPlayerConditionID, CasterUnitConditionID, "
"PlayerConditionID, UnitConditionID, IconFileDataID, ActiveIconFileDataID, Flags, DifficultyID, Priority FROM spell_x_spell_visual"
" ORDER BY ID DESC", CONNECTION_SYNCH);
// SummonProperties.db2
PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Flags, Category, Faction, Type, Slot FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -329,6 +329,8 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY,
HOTFIX_SEL_MOUNT_X_DISPLAY,
HOTFIX_SEL_MOVIE,
HOTFIX_SEL_NAME_GEN,
+14 -1
View File
@@ -508,7 +508,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const
QuestObjective const* obj = sObjectMgr->GetQuestObjective(ConditionValue1);
if (!obj)
break;
condMeets = (!player->GetQuestRewardStatus(obj->QuestID) && player->IsQuestObjectiveComplete(*obj));
}
break;
@@ -2590,6 +2590,19 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
if (condition->LifetimeMaxPVPRank && player->GetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_LIFETIME_MAX_PVP_RANK) != condition->LifetimeMaxPVPRank)
return false;
if (condition->MovementFlags[0] && !(player->GetUnitMovementFlags() & condition->MovementFlags[0]))
return false;
if (condition->MovementFlags[1] && !(player->GetExtraUnitMovementFlags() & condition->MovementFlags[1]))
return false;
if (condition->MainHandItemSubclassMask)
{
Item* mainHand = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
if (!mainHand || !((1 << mainHand->GetTemplate()->GetSubClass()) & condition->MainHandItemSubclassMask))
return false;
}
if (condition->PartyStatus)
{
Group const* group = player->GetGroup();
+113 -81
View File
@@ -38,13 +38,13 @@ struct AchievementLoadInfo
{ false, FT_SHORT, "Supercedes" },
{ false, FT_SHORT, "Category" },
{ false, FT_SHORT, "UIOrder" },
{ false, FT_SHORT, "IconID" },
{ false, FT_SHORT, "SharesCriteria" },
{ false, FT_SHORT, "CriteriaTree" },
{ true, FT_BYTE, "Faction" },
{ false, FT_BYTE, "Points" },
{ false, FT_BYTE, "MinimumCriteria" },
{ false, FT_INT, "ID" },
{ false, FT_INT, "IconFileDataID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT);
return &loadInfo;
@@ -184,6 +184,8 @@ struct ArtifactLoadInfo
{ false, FT_SHORT, "SpecID" },
{ false, FT_BYTE, "ArtifactCategoryID" },
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "UiModelSceneID" },
{ false, FT_INT, "SpellVisualKitID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT);
return &loadInfo;
@@ -202,13 +204,13 @@ struct ArtifactAppearanceLoadInfo
{ false, FT_FLOAT, "ModelAlpha" },
{ false, FT_INT, "ShapeshiftDisplayID" },
{ false, FT_SHORT, "ArtifactAppearanceSetID" },
{ false, FT_SHORT, "PlayerConditionID" },
{ false, FT_SHORT, "Unknown" },
{ false, FT_BYTE, "DisplayIndex" },
{ false, FT_BYTE, "AppearanceModID" },
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "ModifiesShapeshiftFormDisplay" },
{ false, FT_INT, "ID" },
{ false, FT_INT, "PlayerConditionID" },
{ false, FT_INT, "ItemAppearanceID" },
{ false, FT_INT, "AltItemAppearanceID" },
};
@@ -264,6 +266,7 @@ struct ArtifactPowerLoadInfo
{ false, FT_BYTE, "ArtifactID" },
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "MaxRank" },
{ false, FT_BYTE, "ArtifactTier" },
{ false, FT_INT, "ID" },
{ true, FT_INT, "RelicType" },
};
@@ -441,6 +444,8 @@ struct BattlePetSpeciesLoadInfo
{ false, FT_BYTE, "PetType" },
{ true, FT_BYTE, "Source" },
{ false, FT_INT, "ID" },
{ false, FT_INT, "CardModelSceneID" },
{ false, FT_INT, "LoadoutModelSceneID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES);
return &loadInfo;
@@ -473,6 +478,8 @@ struct BattlemasterListLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_INT, "IconFileDataID" },
{ false, FT_STRING, "GameType" },
{ false, FT_STRING, "ShortDescription" },
{ false, FT_STRING, "LongDescription" },
{ true, FT_SHORT, "MapID1" },
{ true, FT_SHORT, "MapID2" },
{ true, FT_SHORT, "MapID3" },
@@ -704,14 +711,11 @@ struct ChrRacesLoadInfo
{ false, FT_FLOAT, "FemaleCustomizeOffset3" },
{ false, FT_INT, "LowResScreenFileDataID" },
{ false, FT_SHORT, "FactionID" },
{ false, FT_SHORT, "ExplorationSoundID" },
{ false, FT_SHORT, "MaleDisplayID" },
{ false, FT_SHORT, "FemaleDisplayID" },
{ false, FT_SHORT, "ResSicknessSpellID" },
{ false, FT_SHORT, "SplashSoundID" },
{ false, FT_SHORT, "CinematicSequenceID" },
{ false, FT_SHORT, "UAMaleCreatureSoundDataID" },
{ false, FT_SHORT, "UAFemaleCreatureSoundDataID" },
{ false, FT_BYTE, "BaseLanguage" },
{ false, FT_BYTE, "CreatureType" },
{ false, FT_BYTE, "TeamID" },
@@ -744,13 +748,13 @@ struct ChrSpecializationLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Name2" },
{ false, FT_STRING, "Description" },
{ false, FT_SHORT, "SpellIconID" },
{ false, FT_BYTE, "ClassID" },
{ false, FT_BYTE, "OrderIndex" },
{ false, FT_BYTE, "PetTalentType" },
{ false, FT_BYTE, "Role" },
{ false, FT_BYTE, "PrimaryStatOrder" },
{ false, FT_INT, "ID" },
{ false, FT_INT, "IconFileDataID" },
{ false, FT_INT, "Flags" },
{ false, FT_INT, "AnimReplacementSetID" },
};
@@ -766,12 +770,12 @@ struct CinematicCameraLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_STRING_NOT_LOCALIZED, "Model" },
{ false, FT_INT, "SoundID" },
{ false, FT_FLOAT, "OriginX" },
{ false, FT_FLOAT, "OriginY" },
{ false, FT_FLOAT, "OriginZ" },
{ false, FT_FLOAT, "OriginFacing" },
{ false, FT_SHORT, "SoundID" },
{ false, FT_INT, "ModelFileDataID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CinematicCameraMeta::Instance(), HOTFIX_SEL_CINEMATIC_CAMERA);
return &loadInfo;
@@ -785,7 +789,7 @@ struct CinematicSequencesLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_SHORT, "SoundID" },
{ false, FT_INT, "SoundID" },
{ false, FT_SHORT, "Camera1" },
{ false, FT_SHORT, "Camera2" },
{ false, FT_SHORT, "Camera3" },
@@ -807,29 +811,30 @@ struct CreatureDisplayInfoLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_INT, "ExtendedDisplayInfoID" },
{ false, FT_FLOAT, "CreatureModelScale" },
{ false, FT_FLOAT, "PlayerModelScale" },
{ false, FT_SHORT, "ModelID" },
{ false, FT_SHORT, "NPCSoundID" },
{ false, FT_BYTE, "SizeClass" },
{ false, FT_BYTE, "Flags" },
{ true, FT_BYTE, "Gender" },
{ false, FT_INT, "ExtendedDisplayInfoID" },
{ false, FT_INT, "TextureVariation1" },
{ false, FT_INT, "TextureVariation2" },
{ false, FT_INT, "TextureVariation3" },
{ false, FT_STRING_NOT_LOCALIZED, "PortraitTextureName" },
{ false, FT_INT, "PortraitCreatureDisplayInfoID" },
{ false, FT_INT, "CreatureGeosetData" },
{ false, FT_INT, "StateSpellVisualKitID" },
{ false, FT_FLOAT, "InstanceOtherPlayerPetScale" },
{ false, FT_SHORT, "ModelID" },
{ false, FT_INT, "PortraitTextureFileDataID" },
{ false, FT_BYTE, "CreatureModelAlpha" },
{ false, FT_SHORT, "SoundID" },
{ false, FT_SHORT, "NPCSoundID" },
{ false, FT_FLOAT, "PlayerModelScale" },
{ false, FT_INT, "PortraitCreatureDisplayInfoID" },
{ false, FT_BYTE, "BloodID" },
{ false, FT_SHORT, "ParticleColorID" },
{ false, FT_INT, "CreatureGeosetData" },
{ false, FT_SHORT, "ObjectEffectPackageID" },
{ false, FT_SHORT, "AnimReplacementSetID" },
{ false, FT_BYTE, "CreatureModelAlpha" },
{ false, FT_BYTE, "SizeClass" },
{ false, FT_BYTE, "BloodID" },
{ false, FT_BYTE, "Flags" },
{ true, FT_BYTE, "Gender" },
{ true, FT_BYTE, "Unk700" },
{ true, FT_BYTE, "UnarmedWeaponSubclass" },
{ false, FT_INT, "StateSpellVisualKitID" },
{ false, FT_FLOAT, "InstanceOtherPlayerPetScale" },
{ false, FT_INT, "MountSpellVisualKitID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO);
return &loadInfo;
@@ -873,7 +878,7 @@ struct CreatureFamilyLoadInfo
{ false, FT_FLOAT, "MinScale" },
{ false, FT_FLOAT, "MaxScale" },
{ false, FT_STRING, "Name" },
{ false, FT_STRING_NOT_LOCALIZED, "IconFile" },
{ false, FT_INT, "IconFileDataID" },
{ false, FT_SHORT, "SkillLine1" },
{ false, FT_SHORT, "SkillLine2" },
{ false, FT_SHORT, "PetFoodMask" },
@@ -978,12 +983,12 @@ struct CriteriaTreeLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_INT, "CriteriaID" },
{ false, FT_INT, "Amount" },
{ false, FT_STRING, "Description" },
{ false, FT_SHORT, "Parent" },
{ false, FT_SHORT, "Flags" },
{ false, FT_BYTE, "Operator" },
{ false, FT_INT, "CriteriaID" },
{ true, FT_INT, "OrderIndex" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE);
@@ -1090,6 +1095,9 @@ struct DifficultyLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_SHORT, "GroupSizeHealthCurveID" },
{ false, FT_SHORT, "GroupSizeDmgCurveID" },
{ false, FT_SHORT, "GroupSizeSpellPointsCurveID" },
{ false, FT_BYTE, "FallbackDifficultyID" },
{ false, FT_BYTE, "InstanceType" },
{ false, FT_BYTE, "MinPlayers" },
@@ -1097,9 +1105,6 @@ struct DifficultyLoadInfo
{ true, FT_BYTE, "OldEnumValue" },
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "ToggleDifficultyID" },
{ false, FT_BYTE, "GroupSizeHealthCurveID" },
{ false, FT_BYTE, "GroupSizeDmgCurveID" },
{ false, FT_BYTE, "GroupSizeSpellPointsCurveID" },
{ false, FT_BYTE, "ItemBonusTreeModID" },
{ false, FT_BYTE, "OrderIndex" },
};
@@ -1114,15 +1119,15 @@ struct DungeonEncounterLoadInfo
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_INT, "CreatureDisplayID" },
{ false, FT_SHORT, "MapID" },
{ false, FT_SHORT, "SpellIconID" },
{ false, FT_BYTE, "DifficultyID" },
{ false, FT_BYTE, "Bit" },
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "ID" },
{ true, FT_INT, "OrderIndex" },
{ false, FT_INT, "TextureFileDataID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER);
return &loadInfo;
@@ -1273,6 +1278,7 @@ struct FactionLoadInfo
{ false, FT_SHORT, "ReputationFlags3" },
{ false, FT_SHORT, "ReputationFlags4" },
{ false, FT_SHORT, "ParentFactionID" },
{ false, FT_SHORT, "ParagonFactionID" },
{ false, FT_BYTE, "ParentFactionCapIn" },
{ false, FT_BYTE, "ParentFactionCapOut" },
{ false, FT_BYTE, "Expansion" },
@@ -1454,7 +1460,7 @@ struct GarrClassSpecLoadInfo
{ false, FT_STRING, "NameFemale" },
{ false, FT_STRING, "NameGenderless" },
{ false, FT_SHORT, "ClassAtlasID" },
{ false, FT_BYTE, "GarrFollItemSetID" },
{ false, FT_SHORT, "GarrFollItemSetID" },
{ false, FT_BYTE, "Limit" },
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "ID" },
@@ -1478,6 +1484,7 @@ struct GarrFollowerLoadInfo
{ false, FT_INT, "AlliancePortraitIconID" },
{ false, FT_INT, "HordeAddedBroadcastTextID" },
{ false, FT_INT, "AllianceAddedBroadcastTextID" },
{ false, FT_STRING, "Name" },
{ false, FT_SHORT, "HordeGarrFollItemSetID" },
{ false, FT_SHORT, "AllianceGarrFollItemSetID" },
{ false, FT_SHORT, "ItemLevelWeapon" },
@@ -1585,11 +1592,11 @@ struct GarrSiteLevelLoadInfo
{ false, FT_FLOAT, "TownHallY" },
{ false, FT_SHORT, "MapID" },
{ false, FT_SHORT, "SiteID" },
{ false, FT_SHORT, "MovieID" },
{ false, FT_SHORT, "UpgradeResourceCost" },
{ false, FT_SHORT, "UpgradeMoneyCost" },
{ false, FT_BYTE, "Level" },
{ false, FT_BYTE, "UITextureKitID" },
{ false, FT_BYTE, "MovieID" },
{ false, FT_BYTE, "Level2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL);
@@ -1810,11 +1817,11 @@ struct HolidaysLoadInfo
{ false, FT_BYTE, "CalendarFlags8" },
{ false, FT_BYTE, "CalendarFlags9" },
{ false, FT_BYTE, "CalendarFlags10" },
{ false, FT_BYTE, "HolidayNameID" },
{ false, FT_BYTE, "HolidayDescriptionID" },
{ false, FT_BYTE, "Priority" },
{ true, FT_BYTE, "CalendarFilterType" },
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "HolidayNameID" },
{ false, FT_INT, "HolidayDescriptionID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS);
return &loadInfo;
@@ -2034,6 +2041,7 @@ struct ItemBonusTreeNodeLoadInfo
{ false, FT_SHORT, "BonusTreeID" },
{ false, FT_SHORT, "SubTreeID" },
{ false, FT_SHORT, "BonusListID" },
{ false, FT_SHORT, "ItemLevelSelectorID" },
{ false, FT_BYTE, "BonusTreeModID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE);
@@ -2457,9 +2465,9 @@ struct ItemSparseLoadInfo
{ false, FT_INT, "Flags3" },
{ false, FT_FLOAT, "Unk1" },
{ false, FT_FLOAT, "Unk2" },
{ false, FT_INT, "BuyCount" },
{ false, FT_INT, "BuyPrice" },
{ false, FT_INT, "SellPrice" },
{ true, FT_INT, "AllowableClass" },
{ true, FT_INT, "AllowableRace" },
{ false, FT_INT, "RequiredSpell" },
{ false, FT_INT, "MaxCount" },
@@ -2494,6 +2502,7 @@ struct ItemSparseLoadInfo
{ false, FT_FLOAT, "ArmorDamageModifier" },
{ false, FT_INT, "Duration" },
{ false, FT_FLOAT, "StatScalingFactor" },
{ true, FT_SHORT, "AllowableClass" },
{ false, FT_SHORT, "ItemLevel" },
{ false, FT_SHORT, "RequiredSkill" },
{ false, FT_SHORT, "RequiredSkillRank" },
@@ -2518,13 +2527,14 @@ struct ItemSparseLoadInfo
{ false, FT_SHORT, "ItemSet" },
{ false, FT_SHORT, "Area" },
{ false, FT_SHORT, "Map" },
{ false, FT_SHORT, "TotemCategory" },
{ false, FT_SHORT, "SocketBonus" },
{ false, FT_SHORT, "GemProperties" },
{ false, FT_SHORT, "ItemLimitCategory" },
{ false, FT_SHORT, "HolidayID" },
{ false, FT_SHORT, "RequiredTransmogHolidayID" },
{ false, FT_SHORT, "ItemNameDescriptionID" },
{ false, FT_BYTE, "Quality" },
{ false, FT_BYTE, "BuyCount" },
{ false, FT_BYTE, "InventoryType" },
{ true, FT_BYTE, "RequiredLevel" },
{ false, FT_BYTE, "RequiredHonorRank" },
@@ -2547,7 +2557,6 @@ struct ItemSparseLoadInfo
{ false, FT_BYTE, "PageMaterial" },
{ true, FT_BYTE, "Material" },
{ false, FT_BYTE, "Sheath" },
{ false, FT_BYTE, "TotemCategory" },
{ false, FT_BYTE, "SocketColor1" },
{ false, FT_BYTE, "SocketColor2" },
{ false, FT_BYTE, "SocketColor3" },
@@ -2683,7 +2692,6 @@ struct LfgDungeonsLoadInfo
{ false, FT_INT, "Flags" },
{ false, FT_STRING_NOT_LOCALIZED, "TextureFilename" },
{ false, FT_STRING, "Description" },
{ false, FT_INT, "PlayerConditionID" },
{ false, FT_FLOAT, "MinItemLevel" },
{ false, FT_SHORT, "MaxLevel" },
{ false, FT_SHORT, "TargetLevelMax" },
@@ -2693,6 +2701,7 @@ struct LfgDungeonsLoadInfo
{ false, FT_SHORT, "LastBossJournalEncounterID" },
{ false, FT_SHORT, "BonusReputationAmount" },
{ false, FT_SHORT, "MentorItemLevel" },
{ false, FT_SHORT, "PlayerConditionID" },
{ false, FT_BYTE, "MinLevel" },
{ false, FT_BYTE, "TargetLevel" },
{ false, FT_BYTE, "TargetLevelMin" },
@@ -2882,6 +2891,8 @@ struct MapLoadInfo
{ false, FT_STRING, "MapName" },
{ false, FT_STRING, "MapDescription0" },
{ false, FT_STRING, "MapDescription1" },
{ false, FT_STRING, "ShortDescription" },
{ false, FT_STRING, "LongDescription" },
{ false, FT_SHORT, "AreaTableID" },
{ false, FT_SHORT, "LoadingScreenID" },
{ true, FT_SHORT, "CorpseMapID" },
@@ -2948,16 +2959,16 @@ struct MountLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "SpellId" },
{ false, FT_INT, "DisplayId" },
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Description" },
{ false, FT_STRING, "SourceDescription" },
{ false, FT_FLOAT, "CameraPivotMultiplier" },
{ false, FT_SHORT, "MountTypeId" },
{ false, FT_SHORT, "Flags" },
{ false, FT_SHORT, "PlayerConditionId" },
{ false, FT_BYTE, "Source" },
{ false, FT_INT, "ID" },
{ false, FT_INT, "PlayerConditionId" },
{ true, FT_INT, "UiModelSceneID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountMeta::Instance(), HOTFIX_SEL_MOUNT);
return &loadInfo;
@@ -3000,6 +3011,22 @@ struct MountTypeXCapabilityLoadInfo
}
};
struct MountXDisplayLoadInfo
{
static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
{ false, FT_INT, "MountID" },
{ false, FT_INT, "DisplayID" },
{ false, FT_INT, "PlayerConditionID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountXDisplayMeta::Instance(), HOTFIX_SEL_MOUNT_X_DISPLAY);
return &loadInfo;
}
};
struct MovieLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -3281,8 +3308,9 @@ struct PlayerConditionLoadInfo
{ false, FT_INT, "PhaseGroupID" },
{ false, FT_INT, "MinAvgItemLevel" },
{ false, FT_INT, "MaxAvgItemLevel" },
{ true, FT_INT, "Unknown7001" },
{ true, FT_INT, "Unknown7002" },
{ true, FT_INT, "MovementFlags1" },
{ true, FT_INT, "MovementFlags2" },
{ false, FT_INT, "MainHandItemSubclassMask" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION);
return &loadInfo;
@@ -3404,8 +3432,8 @@ struct QuestPackageItemLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_INT, "ItemID" },
{ false, FT_SHORT, "QuestPackageID" },
{ false, FT_BYTE, "ItemCount" },
{ false, FT_BYTE, "FilterType" },
{ false, FT_INT, "ItemCount" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM);
return &loadInfo;
@@ -3603,10 +3631,10 @@ struct SkillLineLoadInfo
{ false, FT_STRING, "DisplayName" },
{ false, FT_STRING, "Description" },
{ false, FT_STRING, "AlternateVerb" },
{ false, FT_SHORT, "SpellIconID" },
{ false, FT_SHORT, "Flags" },
{ false, FT_BYTE, "CategoryID" },
{ false, FT_BYTE, "CanLink" },
{ false, FT_INT, "IconFileDataID" },
{ false, FT_INT, "ParentSkillLineID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE);
@@ -3624,7 +3652,6 @@ struct SkillLineAbilityLoadInfo
{ false, FT_INT, "SpellID" },
{ false, FT_INT, "RaceMask" },
{ false, FT_INT, "SupercedesSpell" },
{ false, FT_INT, "Unknown703" },
{ false, FT_SHORT, "SkillLine" },
{ false, FT_SHORT, "MinSkillLineRank" },
{ false, FT_SHORT, "TrivialSkillLineRankHigh" },
@@ -3633,6 +3660,7 @@ struct SkillLineAbilityLoadInfo
{ false, FT_SHORT, "TradeSkillCategoryID" },
{ false, FT_BYTE, "AcquireMethod" },
{ false, FT_BYTE, "NumSkillUps" },
{ false, FT_BYTE, "Unknown703" },
{ true, FT_INT, "ClassMask" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY);
@@ -3894,7 +3922,7 @@ struct SpellDurationLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_INT, "Duration" },
{ true, FT_INT, "MaxDuration" },
{ true, FT_SHORT, "DurationPerLevel" },
{ true, FT_INT, "DurationPerLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION);
return &loadInfo;
@@ -3907,37 +3935,38 @@ struct SpellEffectLoadInfo
{
static DB2FieldMeta const fields[] =
{
{ false, FT_FLOAT, "EffectAmplitude" },
{ false, FT_FLOAT, "EffectBonusCoefficient" },
{ false, FT_FLOAT, "EffectChainAmplitude" },
{ false, FT_FLOAT, "EffectPointsPerResource" },
{ false, FT_FLOAT, "EffectRealPointsPerLevel" },
{ false, FT_INT, "EffectSpellClassMask1" },
{ false, FT_INT, "EffectSpellClassMask2" },
{ false, FT_INT, "EffectSpellClassMask3" },
{ false, FT_INT, "EffectSpellClassMask4" },
{ false, FT_FLOAT, "EffectPosFacing" },
{ false, FT_FLOAT, "BonusCoefficientFromAP" },
{ false, FT_INT, "ID" },
{ false, FT_INT, "DifficultyID" },
{ false, FT_INT, "SpellID" },
{ false, FT_INT, "Effect" },
{ false, FT_INT, "EffectAura" },
{ false, FT_INT, "EffectAuraPeriod" },
{ true, FT_INT, "EffectBasePoints" },
{ false, FT_INT, "EffectChainTargets" },
{ true, FT_INT, "EffectDieSides" },
{ false, FT_INT, "EffectItemType" },
{ false, FT_INT, "EffectMechanic" },
{ false, FT_INT, "EffectIndex" },
{ true, FT_INT, "EffectMiscValue" },
{ true, FT_INT, "EffectMiscValueB" },
{ false, FT_INT, "EffectRadiusIndex" },
{ false, FT_INT, "EffectRadiusMaxIndex" },
{ false, FT_INT, "EffectTriggerSpell" },
{ false, FT_INT, "ImplicitTarget1" },
{ false, FT_INT, "ImplicitTarget2" },
{ false, FT_INT, "SpellID" },
{ false, FT_INT, "EffectIndex" },
{ false, FT_INT, "DifficultyID" },
{ false, FT_FLOAT, "EffectAmplitude" },
{ false, FT_INT, "EffectAuraPeriod" },
{ false, FT_FLOAT, "EffectBonusCoefficient" },
{ false, FT_FLOAT, "EffectChainAmplitude" },
{ false, FT_INT, "EffectChainTargets" },
{ true, FT_INT, "EffectDieSides" },
{ false, FT_INT, "EffectItemType" },
{ false, FT_INT, "EffectMechanic" },
{ false, FT_FLOAT, "EffectPointsPerResource" },
{ false, FT_FLOAT, "EffectRealPointsPerLevel" },
{ false, FT_INT, "EffectTriggerSpell" },
{ false, FT_FLOAT, "EffectPosFacing" },
{ false, FT_INT, "EffectAttributes" },
{ false, FT_FLOAT, "BonusCoefficientFromAP" },
{ false, FT_FLOAT, "PvPMultiplier" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT);
return &loadInfo;
@@ -4156,9 +4185,9 @@ struct SpellMiscLoadInfo
{ false, FT_SHORT, "CastingTimeIndex" },
{ false, FT_SHORT, "DurationIndex" },
{ false, FT_SHORT, "RangeIndex" },
{ false, FT_SHORT, "SpellIconID" },
{ false, FT_SHORT, "ActiveIconID" },
{ false, FT_BYTE, "SchoolMask" },
{ false, FT_INT, "IconFileDataID" },
{ false, FT_INT, "ActiveIconFileDataID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC);
return &loadInfo;
@@ -4352,23 +4381,23 @@ struct SpellShapeshiftFormLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_FLOAT, "WeaponDamageVariance" },
{ false, FT_INT, "Flags" },
{ false, FT_SHORT, "AttackIconID" },
{ false, FT_SHORT, "CombatRoundTime" },
{ false, FT_SHORT, "CreatureDisplayID1" },
{ false, FT_SHORT, "CreatureDisplayID2" },
{ false, FT_SHORT, "CreatureDisplayID3" },
{ false, FT_SHORT, "CreatureDisplayID4" },
{ false, FT_SHORT, "PresetSpellID1" },
{ false, FT_SHORT, "PresetSpellID2" },
{ false, FT_SHORT, "PresetSpellID3" },
{ false, FT_SHORT, "PresetSpellID4" },
{ false, FT_SHORT, "PresetSpellID5" },
{ false, FT_SHORT, "PresetSpellID6" },
{ false, FT_SHORT, "PresetSpellID7" },
{ false, FT_SHORT, "PresetSpellID8" },
{ false, FT_SHORT, "MountTypeID" },
{ true, FT_BYTE, "CreatureType" },
{ false, FT_BYTE, "BonusActionBar" },
{ false, FT_INT, "AttackIconFileDataID" },
{ false, FT_INT, "CreatureDisplayID1" },
{ false, FT_INT, "CreatureDisplayID2" },
{ false, FT_INT, "CreatureDisplayID3" },
{ false, FT_INT, "CreatureDisplayID4" },
{ false, FT_INT, "PresetSpellID1" },
{ false, FT_INT, "PresetSpellID2" },
{ false, FT_INT, "PresetSpellID3" },
{ false, FT_INT, "PresetSpellID4" },
{ false, FT_INT, "PresetSpellID5" },
{ false, FT_INT, "PresetSpellID6" },
{ false, FT_INT, "PresetSpellID7" },
{ false, FT_INT, "PresetSpellID8" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM);
return &loadInfo;
@@ -4421,15 +4450,18 @@ struct SpellXSpellVisualLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "SpellID" },
{ false, FT_INT, "SpellVisualID" },
{ false, FT_INT, "ID" },
{ false, FT_FLOAT, "Chance" },
{ false, FT_SHORT, "SpellVisualID1" },
{ false, FT_SHORT, "SpellVisualID2" },
{ false, FT_SHORT, "CasterPlayerConditionID" },
{ false, FT_SHORT, "CasterUnitConditionID" },
{ false, FT_SHORT, "PlayerConditionID" },
{ false, FT_SHORT, "UnitConditionID" },
{ false, FT_INT, "IconFileDataID" },
{ false, FT_INT, "ActiveIconFileDataID" },
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "DifficultyID" },
{ false, FT_BYTE, "Priority" },
{ false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL);
return &loadInfo;
File diff suppressed because it is too large Load Diff
+19 -13
View File
@@ -133,7 +133,7 @@ DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRand
DB2Storage<ItemSearchNameEntry> sItemSearchNameStore("ItemSearchName.db2", ItemSearchNameLoadInfo::Instance());
DB2Storage<ItemSetEntry> sItemSetStore("ItemSet.db2", ItemSetLoadInfo::Instance());
DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellLoadInfo::Instance());
DB2Storage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseLoadInfo::Instance());
DB2Storage<ItemSparseEntry> sItemSparseStore("ItemSparse.db2", ItemSparseLoadInfo::Instance());
DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecLoadInfo::Instance());
DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideLoadInfo::Instance());
DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeLoadInfo::Instance());
@@ -150,6 +150,7 @@ DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree
DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityLoadInfo::Instance());
DB2Storage<MountEntry> sMountStore("Mount.db2", MountLoadInfo::Instance());
DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityLoadInfo::Instance());
DB2Storage<MountXDisplayEntry> sMountXDisplayStore("MountXDisplay.db2", MountXDisplayLoadInfo::Instance());
DB2Storage<MovieEntry> sMovieStore("Movie.db2", MovieLoadInfo::Instance());
DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenLoadInfo::Instance());
DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityLoadInfo::Instance());
@@ -241,8 +242,6 @@ TaxiPathNodesByPath sTaxiPathNodesByPath;
typedef std::vector<std::string> DB2StoreProblemList;
uint32 DB2FilesCount = 0;
template<class T, template<class> class DB2>
inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path, uint32 defaultLocale, DB2<T> const& /*hint*/)
{
@@ -265,8 +264,6 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
storage->GetFileName().c_str(), loadInfo->Meta->GetRecordSize(), sizeof(T));
}
++DB2FilesCount;
if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale))
{
storage->LoadFromDB();
@@ -448,6 +445,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sMountCapabilityStore);
LOAD_DB2(sMountStore);
LOAD_DB2(sMountTypeXCapabilityStore);
LOAD_DB2(sMountXDisplayStore);
LOAD_DB2(sMovieStore);
LOAD_DB2(sNameGenStore);
LOAD_DB2(sNamesProfanityStore);
@@ -734,6 +732,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (MountTypeXCapabilityEntry const* mountTypeCapability : sMountTypeXCapabilityStore)
_mountCapabilitiesByType[mountTypeCapability->MountTypeID].insert(mountTypeCapability);
for (MountXDisplayEntry const* mountDisplay : sMountXDisplayStore)
_mountDisplays[mountDisplay->MountID].push_back(mountDisplay);
for (NameGenEntry const* nameGen : sNameGenStore)
_nameGenData[nameGen->Race][nameGen->Sex].push_back(nameGen);
@@ -918,18 +919,18 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
_worldMapAreaByAreaID[worldMapArea->AreaID] = worldMapArea;
// error checks
if (bad_db2_files.size() >= DB2FilesCount)
if (bad_db2_files.size() == _stores.size())
{
TC_LOG_ERROR("misc", "\nIncorrect DataDir value in worldserver.conf or ALL required *.db2 files (%d) not found by path: %sdbc/%s/", DB2FilesCount, dataPath.c_str(), localeNames[defaultLocale]);
TC_LOG_ERROR("misc", "\nIncorrect DataDir value in worldserver.conf or ALL required *.db2 files (" SZFMTD ") not found by path: %sdbc/%s/", _stores.size(), dataPath.c_str(), localeNames[defaultLocale]);
exit(1);
}
else if (!bad_db2_files.empty())
{
std::string str;
for (auto i = bad_db2_files.begin(); i != bad_db2_files.end(); ++i)
str += *i + "\n";
for (auto const& bad_db2_file : bad_db2_files)
str += bad_db2_file + "\n";
TC_LOG_ERROR("misc", "\nSome required *.db2 files (%u from %d) not found or not compatible:\n%s", (uint32)bad_db2_files.size(), DB2FilesCount, str.c_str());
TC_LOG_ERROR("misc", "\nSome required *.db2 files (" SZFMTD " from " SZFMTD ") not found or not compatible:\n%s", bad_db2_files.size(), _stores.size(), str.c_str());
exit(1);
}
@@ -946,7 +947,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
exit(1);
}
TC_LOG_INFO("server.loading", ">> Initialized %d DB2 data stores in %u ms", DB2FilesCount, GetMSTimeDiffToNow(oldMSTime));
TC_LOG_INFO("server.loading", ">> Initialized " SZFMTD " DB2 data stores in %u ms", _stores.size(), GetMSTimeDiffToNow(oldMSTime));
}
DB2StorageBase const* DB2Manager::GetStorage(uint32 type) const
@@ -1005,7 +1006,7 @@ time_t DB2Manager::GetHotfixDate(uint32 entry, uint32 type) const
if (time_t(hotfix.Timestamp) > ret)
ret = time_t(hotfix.Timestamp);
return ret ? ret : time(NULL);
return ret ? ret : time(nullptr);
}
std::vector<uint32> DB2Manager::GetAreasForGroup(uint32 areaGroupId) const
@@ -1563,6 +1564,11 @@ DB2Manager::MountTypeXCapabilitySet const* DB2Manager::GetMountCapabilities(uint
return nullptr;
}
DB2Manager::MountXDisplayContainer const* DB2Manager::GetMountDisplays(uint32 mountId) const
{
return Trinity::Containers::MapGetValuePtr(_mountDisplays, mountId);
}
std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const
{
ASSERT(gender < GENDER_NONE);
@@ -1596,7 +1602,7 @@ ResponseCodes DB2Manager::ValidateName(std::wstring const& name, LocaleConstant
PvpDifficultyEntry const* DB2Manager::GetBattlegroundBracketByLevel(uint32 mapid, uint32 level)
{
PvpDifficultyEntry const* maxEntry = NULL; // used for level > max listed level case
PvpDifficultyEntry const* maxEntry = nullptr; // used for level > max listed level case
for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i)
{
if (PvpDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i))
+4
View File
@@ -260,6 +260,8 @@ public:
typedef std::unordered_map<uint32, MountEntry const*> MountContainer;
typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet;
typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer;
typedef std::vector<MountXDisplayEntry const*> MountXDisplayContainer;
typedef std::unordered_map<uint32, MountXDisplayContainer> MountDisplaysCointainer;
typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer;
typedef std::array<std::vector<Trinity::wregex>, TOTAL_LOCALES + 1> NameValidationRegexContainer;
typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer;
@@ -327,6 +329,7 @@ public:
MountEntry const* GetMount(uint32 spellId) const;
MountEntry const* GetMountById(uint32 id) const;
MountTypeXCapabilitySet const* GetMountCapabilities(uint32 mountType) const;
MountXDisplayContainer const* GetMountDisplays(uint32 mountId) const;
ResponseCodes ValidateName(std::wstring const& name, LocaleConstant locale) const;
std::set<uint32> GetPhasesForGroup(uint32 group) const;
PowerTypeEntry const* GetPowerTypeEntry(Powers power) const;
@@ -382,6 +385,7 @@ private:
MapDifficultyContainer _mapDifficulties;
MountContainer _mountsBySpellId;
MountCapabilitiesByTypeContainer _mountCapabilitiesByType;
MountDisplaysCointainer _mountDisplays;
NameGenContainer _nameGenData;
NameValidationRegexContainer _nameValidators;
PhaseGroupContainer _phasesByGroup;
+94 -69
View File
@@ -34,13 +34,13 @@ struct AchievementEntry
uint16 Supercedes; // its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin)
uint16 Category;
uint16 UIOrder;
uint16 IconID;
uint16 SharesCriteria; // referenced achievement (counting of all completed criterias)
uint16 CriteriaTree;
int8 Faction; // -1 = all, 0 = horde, 1 = alliance
uint8 Points;
uint8 MinimumCriteria; // need this count of completed criterias (own or referenced achievement criterias)
uint32 ID;
uint32 IconFileDataID;
};
struct AnimKitEntry
@@ -130,6 +130,8 @@ struct ArtifactEntry
uint16 SpecID;
uint8 ArtifactCategoryID;
uint8 Flags;
uint32 UiModelSceneID;
uint32 SpellVisualKitID;
};
struct ArtifactAppearanceEntry
@@ -140,13 +142,13 @@ struct ArtifactAppearanceEntry
float ModelAlpha;
uint32 ShapeshiftDisplayID;
uint16 ArtifactAppearanceSetID;
uint16 PlayerConditionID;
uint16 Unknown;
uint8 DisplayIndex;
uint8 AppearanceModID;
uint8 Flags;
uint8 ModifiesShapeshiftFormDisplay;
uint32 ID;
uint32 PlayerConditionID;
uint32 ItemAppearanceID;
uint32 AltItemAppearanceID;
};
@@ -177,6 +179,7 @@ struct ArtifactPowerEntry
uint8 ArtifactID;
uint8 Flags;
uint8 MaxRank;
uint8 ArtifactTier;
uint32 ID;
int32 RelicType;
};
@@ -265,6 +268,8 @@ struct BattlePetSpeciesEntry
uint8 PetType;
int8 Source;
uint32 ID;
uint32 CardModelSceneID;
uint32 LoadoutModelSceneID;
};
struct BattlePetSpeciesStateEntry
@@ -281,6 +286,8 @@ struct BattlemasterListEntry
LocalizedString* Name;
uint32 IconFileDataID;
LocalizedString* GameType;
LocalizedString* ShortDescription;
LocalizedString* LongDescription;
int16 MapID[16];
uint16 HolidayWorldState;
uint16 PlayerConditionID;
@@ -402,14 +409,11 @@ struct ChrRacesEntry
float FemaleCustomizeOffset[3];
uint32 LowResScreenFileDataID;
uint16 FactionID;
uint16 ExplorationSoundID;
uint16 MaleDisplayID;
uint16 FemaleDisplayID;
uint16 ResSicknessSpellID;
uint16 SplashSoundID;
uint16 CinematicSequenceID;
uint16 UAMaleCreatureSoundDataID;
uint16 UAFemaleCreatureSoundDataID;
uint8 BaseLanguage;
uint8 CreatureType;
uint8 TeamID;
@@ -433,13 +437,13 @@ struct ChrSpecializationEntry
LocalizedString* Name;
LocalizedString* Name2;
LocalizedString* Description;
uint16 SpellIconID;
uint8 ClassID;
uint8 OrderIndex;
uint8 PetTalentType;
uint8 Role;
uint8 PrimaryStatOrder;
uint32 ID;
uint32 IconFileDataID;
uint32 Flags;
uint32 AnimReplacementSetID;
@@ -452,43 +456,44 @@ struct ChrSpecializationEntry
struct CinematicCameraEntry
{
uint32 ID;
char const* Model; // Model filename (translate .mdx to .m2)
uint32 SoundID; // Sound ID (voiceover for cinematic)
DBCPosition3D Origin; // Position in map used for basis for M2 co-ordinates
float OriginFacing; // Orientation in map used for basis for M2 co-ordinates
uint16 SoundID; // Sound ID (voiceover for cinematic)
uint32 ModelFileDataID; // Model
};
struct CinematicSequencesEntry
{
uint32 ID;
uint16 SoundID;
uint32 SoundID;
uint16 Camera[8];
};
struct CreatureDisplayInfoEntry
{
uint32 ID;
uint32 ExtendedDisplayInfoID;
float CreatureModelScale;
float PlayerModelScale;
uint32 TextureVariation[3];
char const* PortraitTextureName;
uint32 PortraitCreatureDisplayInfoID;
uint32 CreatureGeosetData;
uint32 StateSpellVisualKitID;
float InstanceOtherPlayerPetScale; // scale of not own player pets inside dungeons/raids/scenarios
uint16 ModelID;
uint16 SoundID;
uint16 NPCSoundID;
uint16 ParticleColorID;
uint16 ObjectEffectPackageID;
uint16 AnimReplacementSetID;
uint8 CreatureModelAlpha;
uint8 SizeClass;
uint8 BloodID;
uint8 Flags;
int8 Gender;
int8 Unk700;
uint32 ExtendedDisplayInfoID;
uint32 TextureVariation[3];
uint32 PortraitTextureFileDataID;
uint8 CreatureModelAlpha;
uint16 SoundID;
float PlayerModelScale;
uint32 PortraitCreatureDisplayInfoID;
uint8 BloodID;
uint16 ParticleColorID;
uint32 CreatureGeosetData;
uint16 ObjectEffectPackageID;
uint16 AnimReplacementSetID;
int8 UnarmedWeaponSubclass;
uint32 StateSpellVisualKitID;
float InstanceOtherPlayerPetScale; // scale of not own player pets inside dungeons/raids/scenarios
uint32 MountSpellVisualKitID;
};
struct CreatureDisplayInfoExtraEntry
@@ -514,7 +519,7 @@ struct CreatureFamilyEntry
float MinScale;
float MaxScale;
LocalizedString* Name;
char const* IconFile;
uint32 IconFileDataID;
uint16 SkillLine[2];
uint16 PetFoodMask;
uint8 MinScaleLevel;
@@ -700,12 +705,12 @@ struct CriteriaEntry
struct CriteriaTreeEntry
{
uint32 ID;
uint32 CriteriaID;
uint32 Amount;
LocalizedString* Description;
uint16 Parent;
uint16 Flags;
uint8 Operator;
uint32 CriteriaID;
int32 OrderIndex;
};
@@ -771,6 +776,9 @@ struct DifficultyEntry
{
uint32 ID;
LocalizedString* Name;
uint16 GroupSizeHealthCurveID;
uint16 GroupSizeDmgCurveID;
uint16 GroupSizeSpellPointsCurveID;
uint8 FallbackDifficultyID;
uint8 InstanceType;
uint8 MinPlayers;
@@ -778,24 +786,21 @@ struct DifficultyEntry
int8 OldEnumValue;
uint8 Flags;
uint8 ToggleDifficultyID;
uint8 GroupSizeHealthCurveID;
uint8 GroupSizeDmgCurveID;
uint8 GroupSizeSpellPointsCurveID;
uint8 ItemBonusTreeModID;
uint8 OrderIndex;
};
struct DungeonEncounterEntry
{
uint32 ID;
LocalizedString* Name;
uint32 CreatureDisplayID;
uint16 MapID;
uint16 SpellIconID;
uint8 DifficultyID;
uint8 Bit;
uint8 Flags;
uint32 ID;
int32 OrderIndex;
uint32 TextureFileDataID;
};
struct DurabilityCostsEntry
@@ -856,6 +861,7 @@ struct FactionEntry
uint16 ReputationClassMask[4];
uint16 ReputationFlags[4];
uint16 ParentFactionID;
uint16 ParagonFactionID;
uint8 ParentFactionCapIn; // The highest rank the faction will profit from incoming spillover
uint8 ParentFactionCapOut;
uint8 Expansion;
@@ -1012,7 +1018,7 @@ struct GarrClassSpecEntry
LocalizedString* NameFemale;
LocalizedString* NameGenderless;
uint16 ClassAtlasID; // UiTextureAtlasMember.db2 ref
uint8 GarrFollItemSetID;
uint16 GarrFollItemSetID;
uint8 Limit;
uint8 Flags;
uint32 ID;
@@ -1028,6 +1034,7 @@ struct GarrFollowerEntry
uint32 AlliancePortraitIconID;
uint32 HordeAddedBroadcastTextID;
uint32 AllianceAddedBroadcastTextID;
LocalizedString* Name;
uint16 HordeGarrFollItemSetID;
uint16 AllianceGarrFollItemSetID;
uint16 ItemLevelWeapon;
@@ -1094,11 +1101,11 @@ struct GarrSiteLevelEntry
DBCPosition2D TownHall;
uint16 MapID;
uint16 SiteID;
uint16 MovieID;
uint16 UpgradeResourceCost;
uint16 UpgradeMoneyCost;
uint8 Level;
uint8 UITextureKitID;
uint8 MovieID;
uint8 Level2;
};
@@ -1198,11 +1205,11 @@ struct HolidaysEntry
uint16 Region;
uint8 Looping;
uint8 CalendarFlags[MAX_HOLIDAY_FLAGS];
uint8 HolidayNameID;
uint8 HolidayDescriptionID;
uint8 Priority;
int8 CalendarFilterType;
uint8 Flags;
uint32 HolidayNameID;
uint32 HolidayDescriptionID;
};
struct ImportPriceArmorEntry
@@ -1302,6 +1309,7 @@ struct ItemBonusTreeNodeEntry
uint16 BonusTreeID;
uint16 SubTreeID;
uint16 BonusListID;
uint16 ItemLevelSelectorID;
uint8 BonusTreeModID;
};
@@ -1498,9 +1506,9 @@ struct ItemSparseEntry
uint32 Flags[MAX_ITEM_PROTO_FLAGS];
float Unk1;
float Unk2;
uint32 BuyCount;
uint32 BuyPrice;
uint32 SellPrice;
int32 AllowableClass;
int32 AllowableRace;
uint32 RequiredSpell;
uint32 MaxCount;
@@ -1517,6 +1525,7 @@ struct ItemSparseEntry
float ArmorDamageModifier;
uint32 Duration;
float StatScalingFactor;
int16 AllowableClass;
uint16 ItemLevel;
uint16 RequiredSkill;
uint16 RequiredSkillRank;
@@ -1532,13 +1541,14 @@ struct ItemSparseEntry
uint16 ItemSet;
uint16 Area;
uint16 Map;
uint16 TotemCategory;
uint16 SocketBonus;
uint16 GemProperties;
uint16 ItemLimitCategory;
uint16 HolidayID;
uint16 RequiredTransmogHolidayID;
uint16 ItemNameDescriptionID;
uint8 Quality;
uint8 BuyCount;
uint8 InventoryType;
int8 RequiredLevel;
uint8 RequiredHonorRank;
@@ -1552,7 +1562,6 @@ struct ItemSparseEntry
uint8 PageMaterial;
int8 Material;
uint8 Sheath;
uint8 TotemCategory;
uint8 SocketColor[MAX_ITEM_PROTO_SOCKETS];
uint8 CurrencySubstitutionID;
uint8 CurrencySubstitutionCount;
@@ -1609,7 +1618,6 @@ struct LfgDungeonsEntry
uint32 Flags;
char const* TextureFilename;
LocalizedString* Description;
uint32 PlayerConditionID;
float MinItemLevel;
uint16 MaxLevel;
uint16 TargetLevelMax;
@@ -1619,6 +1627,7 @@ struct LfgDungeonsEntry
uint16 LastBossJournalEncounterID;
uint16 BonusReputationAmount;
uint16 MentorItemLevel;
uint16 PlayerConditionID;
uint8 MinLevel;
uint8 TargetLevel;
uint8 TargetLevelMin;
@@ -1703,6 +1712,8 @@ struct MapEntry
LocalizedString* MapName;
LocalizedString* MapDescription0; // Horde
LocalizedString* MapDescription1; // Alliance
LocalizedString* ShortDescription;
LocalizedString* LongDescription;
uint16 AreaTableID;
uint16 LoadingScreenID;
int16 CorpseMapID; // map_id of entrance map in ghost mode (continent always and in most cases = normal entrance)
@@ -1784,16 +1795,16 @@ struct ModifierTreeEntry
struct MountEntry
{
uint32 SpellId;
uint32 DisplayId;
LocalizedString* Name;
LocalizedString* Description;
LocalizedString* SourceDescription;
float CameraPivotMultiplier;
uint16 MountTypeId;
uint16 Flags;
uint16 PlayerConditionId;
uint8 Source;
uint32 ID;
uint32 PlayerConditionId;
int32 UiModelSceneID;
};
struct MountCapabilityEntry
@@ -1816,6 +1827,14 @@ struct MountTypeXCapabilityEntry
uint8 OrderIndex;
};
struct MountXDisplayEntry
{
uint32 ID;
uint32 MountID;
uint32 DisplayID;
uint32 PlayerConditionID;
};
struct MovieEntry
{
uint32 ID;
@@ -1957,7 +1976,8 @@ struct PlayerConditionEntry
uint32 PhaseGroupID;
uint32 MinAvgItemLevel;
uint32 MaxAvgItemLevel;
int32 Unknown700[2];
int32 MovementFlags[2];
uint32 MainHandItemSubclassMask;
};
struct PowerDisplayEntry
@@ -2016,8 +2036,8 @@ struct QuestPackageItemEntry
uint32 ID;
uint32 ItemID;
uint16 QuestPackageID;
uint8 ItemCount;
uint8 FilterType;
uint32 ItemCount;
};
struct QuestSortEntry
@@ -2112,10 +2132,10 @@ struct SkillLineEntry
LocalizedString* DisplayName;
LocalizedString* Description;
LocalizedString* AlternateVerb;
uint16 SpellIconID;
uint16 Flags;
uint8 CategoryID;
uint8 CanLink;
uint32 IconFileDataID;
uint32 ParentSkillLineID;
};
@@ -2125,7 +2145,6 @@ struct SkillLineAbilityEntry
uint32 SpellID;
uint32 RaceMask;
uint32 SupercedesSpell;
uint32 Unknown703;
uint16 SkillLine;
uint16 MinSkillLineRank;
uint16 TrivialSkillLineRankHigh;
@@ -2134,6 +2153,7 @@ struct SkillLineAbilityEntry
uint16 TradeSkillCategoryID;
uint8 AcquireMethod;
uint8 NumSkillUps;
uint8 Unknown703;
int32 ClassMask;
};
@@ -2288,38 +2308,39 @@ struct SpellDurationEntry
uint32 ID;
int32 Duration;
int32 MaxDuration;
int16 DurationPerLevel;
int32 DurationPerLevel;
};
struct SpellEffectEntry
{
float EffectAmplitude;
float EffectBonusCoefficient;
float EffectChainAmplitude;
float EffectPointsPerResource;
float EffectRealPointsPerLevel;
flag128 EffectSpellClassMask;
float EffectPosFacing;
float BonusCoefficientFromAP;
uint32 ID;
uint32 DifficultyID;
uint32 SpellID;
uint32 Effect;
uint32 EffectAura;
uint32 EffectAuraPeriod;
int32 EffectBasePoints;
uint32 EffectChainTargets;
int32 EffectDieSides;
uint32 EffectItemType;
uint32 EffectMechanic;
uint32 EffectIndex;
int32 EffectMiscValue;
int32 EffectMiscValueB;
uint32 EffectRadiusIndex;
uint32 EffectRadiusMaxIndex;
uint32 EffectTriggerSpell;
uint32 ImplicitTarget[2];
uint32 SpellID;
uint32 EffectIndex;
uint32 DifficultyID;
float EffectAmplitude;
uint32 EffectAuraPeriod;
float EffectBonusCoefficient;
float EffectChainAmplitude;
uint32 EffectChainTargets;
int32 EffectDieSides;
uint32 EffectItemType;
uint32 EffectMechanic;
float EffectPointsPerResource;
float EffectRealPointsPerLevel;
uint32 EffectTriggerSpell;
float EffectPosFacing;
uint32 EffectAttributes;
float BonusCoefficientFromAP;
float PvPMultiplier;
};
#define MAX_SPELL_EFFECTS 32
@@ -2437,9 +2458,9 @@ struct SpellMiscEntry
uint16 CastingTimeIndex;
uint16 DurationIndex;
uint16 RangeIndex;
uint16 SpellIconID;
uint16 ActiveIconID;
uint8 SchoolMask;
uint32 IconFileDataID;
uint32 ActiveIconFileDataID;
};
struct SpellPowerEntry
@@ -2542,13 +2563,13 @@ struct SpellShapeshiftFormEntry
LocalizedString* Name;
float WeaponDamageVariance;
uint32 Flags;
uint16 AttackIconID;
uint16 CombatRoundTime;
uint16 CreatureDisplayID[4];
uint16 PresetSpellID[MAX_SHAPESHIFT_SPELLS];
uint16 MountTypeID;
int8 CreatureType;
uint8 BonusActionBar;
uint32 AttackIconFileDataID;
uint32 CreatureDisplayID[4];
uint32 PresetSpellID[MAX_SHAPESHIFT_SPELLS];
};
struct SpellTargetRestrictionsEntry
@@ -2577,14 +2598,18 @@ struct SpellTotemsEntry
struct SpellXSpellVisualEntry
{
uint32 SpellID;
uint32 SpellVisualID;
uint32 ID;
float Chance;
uint16 SpellVisualID[2];
uint16 CasterPlayerConditionID;
uint16 CasterUnitConditionID;
uint16 PlayerConditionID;
uint16 UnitConditionID;
uint32 IconFileDataID;
uint32 ActiveIconFileDataID;
uint8 Flags;
uint8 DifficultyID;
uint8 Priority;
uint32 ID;
};
struct SummonPropertiesEntry
+5 -4
View File
@@ -147,7 +147,7 @@ enum ArtifactPowerFlag : uint8
ARTIFACT_POWER_FLAG_DONT_COUNT_FIRST_BONUS_RANK = 0x10,
};
#define BATTLE_PET_SPECIES_MAX_ID 2023
#define BATTLE_PET_SPECIES_MAX_ID 2051
enum ChrSpecializationFlag
{
@@ -545,7 +545,7 @@ enum Difficulty : uint8
DIFFICULTY_10_HC = 5,
DIFFICULTY_25_HC = 6,
DIFFICULTY_LFR = 7,
DIFFICULTY_CHALLENGE = 8,
DIFFICULTY_MYTHIC_KEYSTONE = 8,
DIFFICULTY_40 = 9,
DIFFICULTY_3_MAN_SCENARIO_HC = 11,
DIFFICULTY_3_MAN_SCENARIO_N = 12,
@@ -558,9 +558,10 @@ enum Difficulty : uint8
DIFFICULTY_EVENT_SCENARIO = 20,
DIFFICULTY_MYTHIC = 23,
DIFFICULTY_TIMEWALKER = 24,
DIFFICULTY_PVP_SCENARIO = 25,
DIFFICULTY_WORLD_PVP_SCENARIO = 25,
DIFFICULTY_5_MAN_SCENARIO_N = 26,
DIFFICULTY_20_MAN_SCENARIO_N = 27,
DIFFICULTY_PVEVP_SCENARIO = 29,
MAX_DIFFICULTY
};
@@ -815,7 +816,7 @@ enum SpellShapeshiftFormFlags
SHAPESHIFT_FORM_PREVENT_EMOTE_SOUNDS = 0x1000
};
#define TaxiMaskSize 239
#define TaxiMaskSize 243
typedef std::array<uint8, TaxiMaskSize> TaxiMask;
enum TotemCategoryType
+2 -11
View File
@@ -183,7 +183,7 @@ bool readCamera(M2Camera const* cam, uint32 buffSize, M2Header const* header, Ci
return true;
}
void LoadM2Cameras(std::string const& dataPath)
TC_GAME_API void LoadM2Cameras(boost::filesystem::path const& dataPath)
{
sFlyByCameraStore.clear();
TC_LOG_INFO("server.loading", ">> Loading Cinematic Camera files");
@@ -191,20 +191,11 @@ void LoadM2Cameras(std::string const& dataPath)
uint32 oldMSTime = getMSTime();
for (CinematicCameraEntry const* cameraEntry : sCinematicCameraStore)
{
std::string filenameWork = dataPath;
filenameWork.append(cameraEntry->Model);
// Replace slashes (always to forward slash, because boost!)
std::replace(filenameWork.begin(), filenameWork.end(), '\\', '/');
boost::filesystem::path filename = filenameWork;
boost::filesystem::path filename = dataPath / Trinity::StringFormat("FILE%08X.xxx", cameraEntry->ModelFileDataID);
// Convert to native format
filename.make_preferred();
// Replace mdx to .m2
filename.replace_extension("m2");
std::ifstream m2file(filename.string().c_str(), std::ios::in | std::ios::binary);
if (!m2file.is_open())
continue;
+9 -1
View File
@@ -21,6 +21,14 @@
#include "Common.h"
#include "G3D/Vector4.h"
namespace boost
{
namespace filesystem
{
class path;
}
}
struct FlyByCamera
{
uint32 timeStamp;
@@ -31,6 +39,6 @@ typedef std::vector<FlyByCamera> FlyByCameraCollection;
TC_GAME_API extern std::unordered_map<uint32, FlyByCameraCollection> sFlyByCameraStore;
TC_GAME_API void LoadM2Cameras(std::string const& dataPath);
TC_GAME_API void LoadM2Cameras(boost::filesystem::path const& dataPath);
#endif
+1 -1
View File
@@ -415,7 +415,7 @@ struct TC_GAME_API CreatureTemplate
case DIFFICULTY_HEROIC_RAID:
return 0;
case DIFFICULTY_10_HC:
case DIFFICULTY_CHALLENGE:
case DIFFICULTY_MYTHIC_KEYSTONE:
case DIFFICULTY_MYTHIC_RAID:
return 1;
case DIFFICULTY_25_HC:
+1
View File
@@ -251,6 +251,7 @@ enum ItemModifier : uint16
ITEM_MODIFIER_CHALLENGE_KEYSTONE_AFFIX_ID_3 = 21,
ITEM_MODIFIER_CHALLENGE_KEYSTONE_IS_CHARGED = 22,
ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL = 23,
ITEM_MODIFIER_ARTIFACT_TIER = 24,
MAX_ITEM_MODIFIERS
};
+1 -1
View File
@@ -5524,7 +5524,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
return true;
}
// Seed of Corruption (Mobs cast) - no die req
if (!dummySpell->SpellFamilyFlags && dummySpell->SpellIconID == 1932)
if (!dummySpell->SpellFamilyFlags && dummySpell->IconFileDataId == 136193)
{
// if damage is more than need deal finish spell
if (triggeredByAura->GetAmount() <= int32(damage))
+21 -1
View File
@@ -17,7 +17,10 @@
*/
#include "Common.h"
#include "ConditionMgr.h"
#include "Containers.h"
#include "DatabaseEnv.h"
#include "DB2Stores.h"
#include "WorldPacket.h"
#include "WorldSession.h"
#include "Opcodes.h"
@@ -184,8 +187,25 @@ void WorldSession::HandleActivateTaxiOpcode(WorldPackets::Taxi::ActivateTaxi& ac
uint32 preferredMountDisplay = 0;
if (MountEntry const* mount = sMountStore.LookupEntry(activateTaxi.FlyingMountID))
{
if (GetPlayer()->HasSpell(mount->SpellId))
preferredMountDisplay = mount->DisplayId;
{
if (DB2Manager::MountXDisplayContainer const* mountDisplays = sDB2Manager.GetMountDisplays(mount->ID))
{
DB2Manager::MountXDisplayContainer usableDisplays;
std::copy_if(mountDisplays->begin(), mountDisplays->end(), std::back_inserter(usableDisplays), [this](MountXDisplayEntry const* mountDisplay)
{
if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(mountDisplay->PlayerConditionID))
return sConditionMgr->IsPlayerMeetingCondition(GetPlayer(), playerCondition);
return true;
});
if (!usableDisplays.empty())
preferredMountDisplay = Trinity::Containers::SelectRandomContainerElement(usableDisplays)->DisplayID;
}
}
}
std::vector<uint32> nodes;
sTaxiPathGraph.GetCompleteNodeRoute(from, to, GetPlayer(), nodes);
+1
View File
@@ -1817,6 +1817,7 @@ void LoadLootTemplates_Skinning()
void LoadLootTemplates_Spell()
{
// TODO: change this to use MiscValue from spell effect as id instead of spell id
TC_LOG_INFO("server.loading", "Loading spell loot templates...");
uint32 oldMSTime = getMSTime();
@@ -1179,7 +1179,7 @@ enum SpellEffectName
SPELL_EFFECT_DISCOVER_TAXI = 154,
SPELL_EFFECT_TITAN_GRIP = 155,
SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC = 156,
SPELL_EFFECT_CREATE_ITEM_2 = 157,
SPELL_EFFECT_CREATE_LOOT = 157, // crafting loot
SPELL_EFFECT_MILLING = 158,
SPELL_EFFECT_ALLOW_RENAME_PET = 159,
SPELL_EFFECT_FORCE_CAST_2 = 160,
@@ -2486,7 +2486,21 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo
if (MountEntry const* mountEntry = sDB2Manager.GetMount(GetId()))
{
displayId = mountEntry->DisplayId;
if (DB2Manager::MountXDisplayContainer const* mountDisplays = sDB2Manager.GetMountDisplays(mountEntry->ID))
{
DB2Manager::MountXDisplayContainer usableDisplays;
std::copy_if(mountDisplays->begin(), mountDisplays->end(), std::back_inserter(usableDisplays), [target](MountXDisplayEntry const* mountDisplay)
{
if (Player* playerTarget = target->ToPlayer())
if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(mountDisplay->PlayerConditionID))
return sConditionMgr->IsPlayerMeetingCondition(playerTarget, playerCondition);
return true;
});
if (!usableDisplays.empty())
displayId = Trinity::Containers::SelectRandomContainerElement(usableDisplays)->DisplayID;
}
// TODO: CREATE TABLE mount_vehicle (mountId, vehicleCreatureId) for future mounts that are vehicles (new mounts no longer have proper data in MiscValue)
//if (MountVehicle const* mountVehicle = sObjectMgr->GetMountVehicle(mountEntry->Id))
// creatureEntry = mountVehicle->VehicleCreatureId;
+2 -2
View File
@@ -3680,7 +3680,7 @@ void Spell::finish(bool ok)
// Unsummon statue
uint32 spell = m_caster->GetUInt32Value(UNIT_CREATED_BY_SPELL);
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell);
if (spellInfo && spellInfo->SpellIconID == 2056)
if (spellInfo && spellInfo->IconFileDataId == 134230)
{
TC_LOG_DEBUG("spells", "Statue %s is unsummoned in spell %d finish", m_caster->GetGUID().ToString().c_str(), m_spellInfo->Id);
m_caster->setDeathState(JUST_DIED);
@@ -6275,7 +6275,7 @@ SpellCastResult Spell::CheckItems()
switch (effect->Effect)
{
case SPELL_EFFECT_CREATE_ITEM:
case SPELL_EFFECT_CREATE_ITEM_2:
case SPELL_EFFECT_CREATE_LOOT:
{
if (!IsTriggered() && effect->ItemType)
{
+3 -2
View File
@@ -1387,6 +1387,7 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype, std::vector<int32> const
num_to_add = pProto->GetMaxStackSize();
/* == gem perfection handling == */
// this is bad, should be done using spell_loot_template (and conditions)
// the chance of getting a perfect result
float perfectCreateChance = 0.0f;
@@ -4398,8 +4399,8 @@ void Spell::EffectLeapBack(SpellEffIndex /*effIndex*/)
float speedxy = effectInfo->MiscValue / 10.f;
float speedz = damage / 10.f;
//1891: Disengage
unitTarget->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891);
// Disengage
unitTarget->JumpTo(speedxy, speedz, m_spellInfo->IconFileDataId != 132572);
}
void Spell::EffectQuestClear(SpellEffIndex /*effIndex*/)
+7 -11
View File
@@ -1024,8 +1024,8 @@ SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const&
Speed = _misc ? _misc->Speed : 0;
SchoolMask = _misc ? _misc->SchoolMask : 0;
AttributesCu = 0;
SpellIconID = _misc ? _misc->SpellIconID : 0;
ActiveIconID = _misc ? _misc->ActiveIconID : 0;
IconFileDataId = _misc ? _misc->IconFileDataID : 0;
ActiveIconFileDataId = _misc ? _misc->ActiveIconFileDataID : 0;
_visuals = std::move(visuals);
// sort all visuals so that the ones without a condition requirement are last on the list
@@ -1224,18 +1224,14 @@ bool SpellInfo::IsExplicitDiscovery() const
SpellEffectInfo const* effect0 = GetEffect(DIFFICULTY_NONE, EFFECT_0);
SpellEffectInfo const* effect1 = GetEffect(DIFFICULTY_NONE, EFFECT_1);
return ((effect0 && (effect0->Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM || effect0->Effect == SPELL_EFFECT_CREATE_ITEM_2))
return ((effect0 && (effect0->Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM || effect0->Effect == SPELL_EFFECT_CREATE_LOOT))
&& effect1 && effect1->Effect == SPELL_EFFECT_SCRIPT_EFFECT)
|| Id == 64323;
}
bool SpellInfo::IsLootCrafting() const
{
SpellEffectInfo const* effect0 = GetEffect(DIFFICULTY_NONE, EFFECT_0);
return effect0 && (effect0->Effect == SPELL_EFFECT_CREATE_RANDOM_ITEM ||
// different random cards from Inscription (121==Virtuoso Inking Set category) r without explicit item
(effect0->Effect == SPELL_EFFECT_CREATE_ITEM_2 &&
((TotemCategory[0] != 0 || (Totem[0] != 0 && SpellIconID == 1)) || effect0->ItemType == 0)));
return HasEffect(SPELL_EFFECT_CREATE_RANDOM_ITEM) || HasEffect(SPELL_EFFECT_CREATE_LOOT);
}
bool SpellInfo::IsQuestTame() const
@@ -3016,10 +3012,10 @@ uint32 SpellInfo::GetSpellVisual(Unit const* caster /*= nullptr*/) const
{
if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(GetSpellXSpellVisualId(caster)))
{
//if (visual->SpellVisualID[1] && forPlayer->GetViolenceLevel() operator 2)
// return visual->SpellVisualID[1];
//if (visual->LowViolenceSpellVisualID && forPlayer->GetViolenceLevel() operator 2)
// return visual->LowViolenceSpellVisualID;
return visual->SpellVisualID[0];
return visual->SpellVisualID;
}
return 0;
+2 -2
View File
@@ -386,8 +386,8 @@ public:
int32 EquippedItemSubClassMask;
int32 EquippedItemInventoryTypeMask;
uint32 TotemCategory[MAX_SPELL_TOTEMS];
uint32 SpellIconID;
uint32 ActiveIconID;
uint32 IconFileDataId;
uint32 ActiveIconFileDataId;
LocalizedString const* SpellName;
uint32 MaxTargetLevel;
uint32 MaxAffectedTargets;
+1 -1
View File
@@ -465,7 +465,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg
// craft spell for crafting non-existed item (break client recipes list show)
case SPELL_EFFECT_CREATE_ITEM:
case SPELL_EFFECT_CREATE_ITEM_2:
case SPELL_EFFECT_CREATE_LOOT:
{
if (effect->ItemType == 0)
{