diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs
index 2f9efd350..a2c302021 100644
--- a/Source/Framework/Constants/AchievementConst.cs
+++ b/Source/Framework/Constants/AchievementConst.cs
@@ -371,24 +371,50 @@ namespace Framework.Constants
//Unk265 = 265,
SelectedAzeriteEssenceRankLower = 266,
SelectedAzeriteEssenceRankGreater = 267,
- //Unk268 = 268,
- //Unk269 = 269,
+ SourceLevelInRangeCt = 268,
+ TargetLevelInRangeCt = 269,
//Unk270 = 270,
//Unk271 = 271,
- //Unk272 = 272,
- //Unk273 = 273,
+ SourceLevelGreaterCt = 272, // Compare Levels Using Content Tuning
+ TargetLevelGreaterCt = 273, // Compare Levels Using Content Tuning
//Unk274 = 274,
//Unk275 = 275,
//Unk276 = 276,
- //Unk277 = 277,
+ RafRecruitInParty = 277, // NYI
//Unk278 = 278,
//Unk279 = 279,
MapOrCosmeticMap = 280,
//Unk281 = 281,
- HasEntitlement = 282,
- HasQuestSession = 283,
+ HasEntitlement = 282, // NYI
+ HasQuestSession = 283, // NYI
//Unk284 = 284,
//Unk285 = 285,
+ //Unk286 = 286,
+ //Unk287 = 287,
+ Covenant = 288,
+ //Unk289 = 289, // Related To Pvp Ranking
+ PermanentAnimaDiversionTalent = 290, // NYI
+ Soulbind = 291,
+ //Unk292 = 292,
+ SourceAreaOrZoneInGroup = 293,
+ //Unk294 = 294,
+ //Unk295 = 295,
+ //Unk296 = 296,
+ //Unk297 = 297,
+ //Unk298 = 298,
+ //Unk299 = 299,
+ SourceInSpecificChromieTime = 300,
+ SourceInAnyChromieTime = 301,
+ //Unk302 = 302,
+ SourceRuneforgeLegendaryKnown = 303,
+ //Unk304 = 304,
+ //Unk305 = 305,
+ //Unk306 = 306,
+ SoulbindConduitRank = 307, // NYI
+ ShapeshiftFormCustomizationDisplay = 308,
+ SoulbindMinConduitsAtRank = 309, // NYI
+ IsRestrictedAccount = 310, // NYI
+ SourceFlying = 311,
}
public enum CriteriaFlags
@@ -628,7 +654,21 @@ namespace Framework.Constants
ReachAccountHonorLevel = 213,
HeartOfAzerothArtifactPowerEarned = 214,
HeartOfAzerothLevelReached = 215,
- TotalTypes = 219
+ MythicKeystoneCompleted = 216, // NYI
+ // 217 - 0 Criterias
+ CompleteQuestAccumulate = 218,
+ BoughtItemFromVendor = 219,
+ SoldItemToVendor = 220,
+ // 221 - 0 Criterias
+ // 222 - 0 Criterias
+ // 223 - 0 Criterias
+ // 224 - 0 Criterias
+ TravelledToArea = 225,
+ // 226 - 0 Criterias
+ // 227 - 0 Criterias
+ ApplyConduit = 228,
+ ConvertItemsToCurrency = 229,
+ TotalTypes = 230
}
public enum CriteriaDataType
diff --git a/Source/Framework/Constants/ChatConst.cs b/Source/Framework/Constants/ChatConst.cs
index 4465f731f..bd2460b4b 100644
--- a/Source/Framework/Constants/ChatConst.cs
+++ b/Source/Framework/Constants/ChatConst.cs
@@ -91,7 +91,8 @@ namespace Framework.Constants
Defense = 0x10000, // Localdefense, Worlddefense
GuildReq = 0x20000, // Guildrecruitment
Lfg = 0x40000, // Lfg
- Unk1 = 0x80000 // General
+ Unk1 = 0x80000, // General
+ NoClientJoin = 0x200000
}
public enum ChannelMemberFlags
diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs
index dff012dff..bab7f4d5f 100644
--- a/Source/Framework/Constants/CliDBConst.cs
+++ b/Source/Framework/Constants/CliDBConst.cs
@@ -938,7 +938,7 @@ namespace Framework.Constants
public enum AzeriteTierUnlockSetFlags
{
- Default = 0x1
+ Default = 0x01
}
public enum BattlegroundBracketId // bracketId for level ranges
@@ -948,26 +948,14 @@ namespace Framework.Constants
Max
}
- public enum CharBaseSectionVariation : byte
+ public enum ChrCustomizationOptionFlag
{
- Skin = 0,
- Face = 1,
- FacialHair = 2,
- Hair = 3,
- Underwear = 4,
- CustomDisplay1 = 5,
- CustomDisplay2 = 6,
- CustomDisplay3 = 7,
-
- Max
+ Disabled = 0x04
}
- public enum CharSectionFlags
+ public enum ChrCustomizationReqFlag
{
- Player = 0x01,
- DeathKnight = 0x04,
- DemonHunter = 0x20,
- Conditional = 0x400
+ HasRequirements = 0x01
}
public enum CharSectionType
@@ -992,7 +980,7 @@ namespace Framework.Constants
Max
}
- public enum BattlemasterListFlags : sbyte
+ public enum BattlemasterListFlags : int
{
Disabled = 0x01,
SkipRoleCheck = 0x02,
@@ -1014,6 +1002,20 @@ namespace Framework.Constants
Recommended = 0x40,
}
+ public enum ContentTuningCalcType
+ {
+ Base = 0,
+ PlusOne = 1,
+ PlusMaxLevelForExpansion = 2
+ }
+
+ public enum ContentTuningFlag
+ {
+ DisabledForItem = 0x04,
+ Horde = 0x8,
+ Alliance = 0x10
+ }
+
public enum Curves
{
ArtifactRelicItemLevelBonus = 1718,
@@ -1852,12 +1854,34 @@ namespace Framework.Constants
CreatureSpellDamage = 9
}
+ public enum UiMapFlag
+ {
+ None = 0x00,
+ NoHighlight = 0x01,
+ ShowOverlays = 0x02,
+ ShowTaxiNodes = 0x04,
+ GarrisonMap = 0x08,
+ FallbackToParentMap = 0x10,
+ NoHighlightTexture = 0x20,
+ ShowTaskObjectives = 0x40,
+ NoWorldPositions = 0x80,
+ HideArchaeologyDigs = 0x100,
+ Deprecated = 0x200,
+ HideIcons = 0x400,
+ HideVignettes = 0x800,
+ ForceAllOverlayExplored = 0x1000,
+ FlightMapShowZoomOut = 0x2000,
+ FlightMapAutoZoom = 0x4000,
+ ForceOnNavbar = 0x8000
+ }
+
public enum UiMapSystem : sbyte
{
World = 0,
Taxi = 1,
Adventure = 2,
- Max = 3
+ SystemMinimap = 3,
+ Max
}
public enum UiMapType
diff --git a/Source/Framework/Constants/GameObjectConst.cs b/Source/Framework/Constants/GameObjectConst.cs
index 742fa339b..db86f12c2 100644
--- a/Source/Framework/Constants/GameObjectConst.cs
+++ b/Source/Framework/Constants/GameObjectConst.cs
@@ -17,7 +17,7 @@
namespace Framework.Constants
{
- public enum GameObjectTypes : byte
+ public enum GameObjectTypes : int
{
Door = 0,
Button = 1,
diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs
index f0cdd4736..381e011e3 100644
--- a/Source/Framework/Constants/ItemConst.cs
+++ b/Source/Framework/Constants/ItemConst.cs
@@ -78,42 +78,27 @@ namespace Framework.Constants
ItemModifier.TransmogAppearanceSpec1,
ItemModifier.TransmogAppearanceSpec2,
ItemModifier.TransmogAppearanceSpec3,
- ItemModifier.TransmogAppearanceSpec4
+ ItemModifier.TransmogAppearanceSpec4,
+ ItemModifier.TransmogAppearanceSpec5
};
- public const ulong AppearanceModifierMaskSpecSpecific =
- (1ul << (int)ItemModifier.TransmogAppearanceSpec1) |
- (1ul << (int)ItemModifier.TransmogAppearanceSpec2) |
- (1ul << (int)ItemModifier.TransmogAppearanceSpec3) |
- (1ul << (int)ItemModifier.TransmogAppearanceSpec4);
-
public static ItemModifier[] IllusionModifierSlotBySpec =
- {
+ {
ItemModifier.EnchantIllusionSpec1,
ItemModifier.EnchantIllusionSpec2,
ItemModifier.EnchantIllusionSpec3,
- ItemModifier.EnchantIllusionSpec4
+ ItemModifier.EnchantIllusionSpec4,
+ ItemModifier.EnchantIllusionSpec5
};
- public const ulong IllusionModifierMaskSpecSpecific =
- (1ul << (int)ItemModifier.EnchantIllusionSpec1) |
- (1ul << (int)ItemModifier.EnchantIllusionSpec2) |
- (1ul << (int)ItemModifier.EnchantIllusionSpec3) |
- (1ul << (int)ItemModifier.EnchantIllusionSpec4);
-
public static ItemModifier[] SecondaryAppearanceModifierSlotBySpec =
{
ItemModifier.TransmogSecondaryAppearanceSpec1,
ItemModifier.TransmogSecondaryAppearanceSpec2,
ItemModifier.TransmogSecondaryAppearanceSpec3,
- ItemModifier.TransmogSecondaryAppearanceSpec4
+ ItemModifier.TransmogSecondaryAppearanceSpec4,
+ ItemModifier.TransmogSecondaryAppearanceSpec5
};
-
- public const ulong SecondaryAppearanceModifierMaskSpecSpecific =
- (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec1) |
- (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec2) |
- (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec3) |
- (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec4);
}
public struct InventorySlots
@@ -219,8 +204,8 @@ namespace Framework.Constants
CritSpellRating = 21,
Corruption = 22,
CorruptionResistance = 23,
- HitTakenSpellRating = 24,
- CritTakenMeleeRating = 25,
+ ModifiedCraftingStat1 = 24,
+ ModifiedCraftingStat2 = 25,
CritTakenRangedRating = 26,
CritTakenSpellRating = 27,
HasteMeleeRating = 28,
@@ -356,7 +341,7 @@ namespace Framework.Constants
ItemLevel = 1,
Stat = 2,
Quality = 3,
- Description = 4,
+ NameSubtitle = 4, // Text under name
Suffix = 5,
Socket = 6,
Appearance = 7,
@@ -376,6 +361,10 @@ namespace Framework.Constants
OverrideCanDisenchant = 21,
OverrideCanScrap = 22,
ItemEffectId = 23,
+ ModifiedCraftingStat = 25,
+ RequiredLevelCurve = 27,
+ DescriptionText = 30, // Item Description
+ OverrideName = 31, // Itemnamedescription Id
}
public enum ItemContext : byte
diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs
index 32f55e3b1..534e67c55 100644
--- a/Source/Framework/Constants/Network/Opcodes.cs
+++ b/Source/Framework/Constants/Network/Opcodes.cs
@@ -1141,7 +1141,7 @@ namespace Framework.Constants
GameObjectPlaySpellVisualKit = 0x2c4a,
GameObjectResetState = 0x2723,
GameObjectSetStateLocal = 0x2806,
- GameObjectUiLink = 0x271f,
+ GameObjectUILink = 0x271f,
GameSpeedSet = 0x267f,
GameTimeSet = 0x2711,
GameTimeUpdate = 0x2710,
diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs
index 3fb982759..05690d2ae 100644
--- a/Source/Framework/Constants/PlayerConst.cs
+++ b/Source/Framework/Constants/PlayerConst.cs
@@ -21,12 +21,15 @@ namespace Framework.Constants
{
public struct PlayerConst
{
+ public const Expansion CurrentExpansion = Expansion.ShadowLands;
+
public const int MaxTalentTiers = 7;
public const int MaxTalentColumns = 3;
public const int MaxTalentRank = 5;
public const int MaxPvpTalentSlots = 4;
public const int MinSpecializationLevel = 10;
- public const int MaxSpecializations = 4;
+ public const int MaxSpecializations = 5;
+ public const int InitialSpecializationIndex = 4;
public const int MaxMasterySpells = 2;
public const int ReqPrimaryTreeTalents = 31;
@@ -42,7 +45,7 @@ namespace Framework.Constants
public const uint infinityCooldownDelayCheck = Time.Month / 2;
public const int MaxPlayerSummonDelay = 2 * Time.Minute;
- public const int TaxiMaskSize = 319;
+ public const int TaxiMaskSize = 336;
// corpse reclaim times
public const int DeathExpireStep = (5 * Time.Minute);
diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs
index 2bc953cd9..6f61081c9 100644
--- a/Source/Framework/Constants/SharedConst.cs
+++ b/Source/Framework/Constants/SharedConst.cs
@@ -34,8 +34,8 @@ namespace Framework.Constants
public const int MaxHolidayDurations = 10;
public const int MaxHolidayDates = 26;
public const int MaxHolidayFlags = 10;
- public const int DefaultMaxLevel = 120;
- public const int MaxLevel = 120;
+ public const int DefaultMaxLevel = 60;
+ public const int MaxLevel = 123;
public const int StrongMaxLevel = 255;
public const int MaxOverrideSpell = 10;
public const int MaxWorldMapOverlayArea = 4;
@@ -48,7 +48,7 @@ namespace Framework.Constants
///
/// BattlePets Const
///
- public const int MaxBattlePetSpeciesId = 2873;
+ public const int MaxBattlePetSpeciesId = 3084;
public const int MaxPetBattleSlots = 3;
public const int MaxBattlePetsPerSpecies = 3;
public const int BattlePetCageItemId = 82800;
@@ -587,9 +587,8 @@ namespace Framework.Constants
WarlordsOfDraenor = 5,
Legion = 6,
BattleForAzeroth = 7,
- Max,
-
ShadowLands = 8,
+ Max,
MaxAccountExpansions
}
@@ -1140,7 +1139,6 @@ namespace Framework.Constants
DeathCorpseReclaimDelayPvp,
DeathSicknessLevel,
DeclinedNamesUsed,
- DemonHuntersPerRealm,
DetectPosCollision,
DieCommandMode,
DisableBreathing,
diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs
index 53a6a4deb..8b3a31d1b 100644
--- a/Source/Framework/Constants/Spells/SpellAuraConst.cs
+++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs
@@ -515,6 +515,16 @@ namespace Framework.Constants
Unk491 = 491,
Unk492 = 492,
Unk493 = 493,
+ SetPowerPointCharge = 494, // NYI
+ TriggerSpellOnExpire = 495, // NYI
+ AllowChangingEquipmentInTorghast = 496, // NYI
+ ModAnimaGain = 497, // NYI
+ CurrencyLossPctOnDeath = 498, // NYI
+ ModRestedXpConsumption = 499,
+ IgnoreSpellChargeCooldown = 500, // NYI
+ ModCriticalDamageTakenFromCaster = 501,
+ ModVersatilityDamageDoneBenefit = 502, // NYI
+ ModVersatilityHealingDoneBenefit = 503, // NYI
Total
}
diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs
index f124e8bf8..037cdc6a1 100644
--- a/Source/Framework/Constants/Spells/SpellConst.cs
+++ b/Source/Framework/Constants/Spells/SpellConst.cs
@@ -1852,6 +1852,10 @@ namespace Framework.Constants
Unk21 = 0x200000, // 21
Unk22 = 0x400000, // 22
Unk23 = 0x800000 // 23
+ }
+ public enum SpellAttr14
+ {
+
}
public enum SpellCustomAttributes
{
@@ -2156,6 +2160,18 @@ namespace Framework.Constants
UpgradeItem = 269,
Unk270 = 270,
ApplyAreaAuraPartyNonrandom = 271,
+ SetCovenant = 272,
+ CraftRuneforgeLegendary = 273,
+ Unk274 = 274,
+ Unk275 = 275,
+ LearnTransmogIllusion = 276,
+ SetChromieTime = 277,
+ Unk278 = 278,
+ LearnGarrTalent = 279,
+ Unk280 = 280,
+ LearnSoulbindConduit = 281,
+ ConvertItemsToCurrency = 282,
+ Unk283 = 283,
TotalSpellEffects
}
@@ -2463,6 +2479,7 @@ namespace Framework.Constants
Unk148 = 148,
Unk149 = 149,
UnitOwnCritter = 150, // own battle pet from UNIT_FIELD_CRITTER
+ Unk151 = 151,
TotalSpellTargets
}
public enum SpellTargetSelectionCategories
diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs
index 33f132f3d..27831a759 100644
--- a/Source/Framework/Database/Databases/CharacterDatabase.cs
+++ b/Source/Framework/Database/Databases/CharacterDatabase.cs
@@ -47,24 +47,29 @@ namespace Framework.Database
PrepareStatement(CharStatements.SEL_MAIL_LIST_INFO, "SELECT id, sender, (SELECT name FROM characters WHERE guid = sender) AS sendername, receiver, (SELECT name FROM characters WHERE guid = receiver) AS receivername, " +
"subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ");
PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?");
- PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
+ PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
- PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " +
+ PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, " +
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
- PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
+ PrepareStatement(CharStatements.SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " +
+ "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID");
+ PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
- PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " +
+ PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, " +
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
+ PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " +
+ "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID");
+
PrepareStatement(CharStatements.SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)");
PrepareStatement(CharStatements.SEL_CHAR_ZONE, "SELECT zone FROM characters WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHAR_POSITION_XYZ, "SELECT map, position_x, position_y, position_z FROM characters WHERE guid = ?");
@@ -74,13 +79,14 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?");
PrepareStatement(CharStatements.INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)");
- PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
+ PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " +
"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " +
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, " +
"knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " +
"FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?");
+ PrepareStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID");
PrepareStatement(CharStatements.SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, extendState, resettime, entranceId FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_AURAS, "SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, difficulty, stackCount, maxDuration, remainTime, remainCharges, castItemId, castItemLevel FROM character_aura WHERE guid = ?");
@@ -411,13 +417,16 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?");
// Corpse
- PrepareStatement(CharStatements.SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?");
- PrepareStatement(CharStatements.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
+ PrepareStatement(CharStatements.SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?");
+ PrepareStatement(CharStatements.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?");
PrepareStatement(CharStatements.DEL_CORPSES_FROM_MAP, "DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?");
PrepareStatement(CharStatements.SEL_CORPSE_PHASES, "SELECT cp.OwnerGuid, cp.PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?");
PrepareStatement(CharStatements.INS_CORPSE_PHASES, "INSERT INTO corpse_phases (OwnerGuid, PhaseId) VALUES (?, ?)");
PrepareStatement(CharStatements.DEL_CORPSE_PHASES, "DELETE FROM corpse_phases WHERE OwnerGuid = ?");
+ PrepareStatement(CharStatements.SEL_CORPSE_CUSTOMIZATIONS, "SELECT cc.ownerGuid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM corpse_customizations cc LEFT JOIN corpse c ON cc.ownerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ? ORDER BY cc.ownerGuid, cc.chrCustomizationOptionID");
+ PrepareStatement(CharStatements.INS_CORPSE_CUSTOMIZATIONS, "INSERT INTO corpse_customizations (ownerGuid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)");
+ PrepareStatement(CharStatements.DEL_CORPSE_CUSTOMIZATIONS, "DELETE FROM corpse_customizations WHERE ownerGuid = ?");
PrepareStatement(CharStatements.SEL_CORPSE_LOCATION, "SELECT mapId, posX, posY, posZ, orientation FROM corpse WHERE guid = ?");
// Creature respawn
@@ -459,13 +468,13 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?");
// Player saving
- PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
+ PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
"map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " +
"taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " +
"extra_flags, stable_slots, at_login, zone, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " +
"power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " +
- "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
- PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," +
+ "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
+ PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," +
"map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," +
"logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," +
"totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," +
@@ -479,6 +488,8 @@ namespace Framework.Database
PrepareStatement(CharStatements.UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?");
PrepareStatement(CharStatements.INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)");
PrepareStatement(CharStatements.UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?");
+ PrepareStatement(CharStatements.INS_CHARACTER_CUSTOMIZATION, "INSERT INTO character_customizations (guid, chrCustomizationOptionID, chrCustomizationChoiceID) VALUES (?, ?, ?)");
+ PrepareStatement(CharStatements.DEL_CHARACTER_CUSTOMIZATIONS, "DELETE FROM character_customizations WHERE guid = ?");
PrepareStatement(CharStatements.INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, legacyRaidDifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?");
@@ -513,7 +524,6 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?");
PrepareStatement(CharStatements.UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extendState = ? WHERE guid = ? AND instance = ?");
PrepareStatement(CharStatements.INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)");
- PrepareStatement(CharStatements.UPD_GENDER_AND_APPEARANCE, "UPDATE characters SET gender = ?, skin = ?, face = ?, hairStyle = ?, hairColor = ?, facialStyle = ?, customDisplay1 = ?, customDisplay2 = ?, customDisplay3 = ? WHERE guid = ?");
PrepareStatement(CharStatements.DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?");
PrepareStatement(CharStatements.UPD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = ? WHERE guid = ? AND friend = ?");
PrepareStatement(CharStatements.INS_CHARACTER_SOCIAL, "INSERT INTO character_social (guid, friend, flags) VALUES (?, ?, ?)");
@@ -808,8 +818,10 @@ namespace Framework.Database
SEL_MAIL_LIST_ITEMS,
SEL_ENUM,
SEL_ENUM_DECLINED_NAME,
+ SEL_ENUM_CUSTOMIZATIONS,
SEL_UNDELETE_ENUM,
SEL_UNDELETE_ENUM_DECLINED_NAME,
+ SEL_UNDELETE_ENUM_CUSTOMIZATIONS,
SEL_FREE_NAME,
SEL_CHAR_ZONE,
SEL_CHAR_POSITION_XYZ,
@@ -820,6 +832,7 @@ namespace Framework.Database
INS_BATTLEGROUND_RANDOM,
SEL_CHARACTER,
+ SEL_CHARACTER_CUSTOMIZATIONS,
SEL_GROUP_MEMBER,
SEL_CHARACTER_INSTANCE,
SEL_CHARACTER_AURAS,
@@ -1094,6 +1107,9 @@ namespace Framework.Database
SEL_CORPSE_PHASES,
INS_CORPSE_PHASES,
DEL_CORPSE_PHASES,
+ SEL_CORPSE_CUSTOMIZATIONS,
+ INS_CORPSE_CUSTOMIZATIONS,
+ DEL_CORPSE_CUSTOMIZATIONS,
SEL_CORPSE_LOCATION,
SEL_CREATURE_RESPAWNS,
@@ -1135,6 +1151,8 @@ namespace Framework.Database
UPD_PETITION_NAME,
INS_PETITION_SIGNATURE,
UPD_ACCOUNT_ONLINE,
+ INS_CHARACTER_CUSTOMIZATION,
+ DEL_CHARACTER_CUSTOMIZATIONS,
INS_GROUP,
INS_GROUP_MEMBER,
DEL_GROUP_MEMBER,
@@ -1169,7 +1187,6 @@ namespace Framework.Database
DEL_CHAR_INSTANCE_BY_INSTANCE_GUID,
UPD_CHAR_INSTANCE,
INS_CHAR_INSTANCE,
- UPD_GENDER_AND_APPEARANCE,
DEL_CHARACTER_SKILL,
UPD_CHARACTER_SOCIAL_FLAGS,
INS_CHARACTER_SOCIAL,
diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs
index a04f121f4..59e01b052 100644
--- a/Source/Framework/Database/Databases/HotfixDatabase.cs
+++ b/Source/Framework/Database/Databases/HotfixDatabase.cs
@@ -22,8 +22,8 @@ namespace Framework.Database
public override void PreparedStatements()
{
// Achievement.db2
- PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " +
- "Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria FROM achievement");
+ PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " +
+ "Points, Flags, UiOrder, IconFileID, RewardItemID, CriteriaTree, SharesCriteria, CovenantID FROM achievement");
PrepareStatement(HotfixStatements.SEL_ACHIEVEMENT_LOCALE, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?");
// AnimationData.db2
@@ -36,9 +36,9 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaID, AreaGroupID FROM area_group_member");
// AreaTable.db2
- PrepareStatement(HotfixStatements.SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " +
- "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, ExplorationLevel, IntroSound, UwIntroSound, FactionGroupMask, " +
- "AmbientMultiplier, MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, Flags1, Flags2, " +
+ PrepareStatement(HotfixStatements.SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " +
+ "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, IntroSound, UwIntroSound, FactionGroupMask, AmbientMultiplier, " +
+ "MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, ContentTuningID, Flags1, Flags2, " +
"LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4 FROM area_table");
PrepareStatement(HotfixStatements.SEL_AREA_TABLE_LOCALE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?");
@@ -47,8 +47,7 @@ namespace Framework.Database
"BoxWidth, BoxHeight, BoxYaw, ShapeType, ShapeID, AreaTriggerActionSetID, Flags FROM area_trigger");
// ArmorLocation.db2
- PrepareStatement(HotfixStatements.SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location" +
- "");
+ PrepareStatement(HotfixStatements.SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location");
// Artifact.db2
PrepareStatement(HotfixStatements.SEL_ARTIFACT, "SELECT Name, ID, UiTextureKitID, UiNameColor, UiBarOverlayColor, UiBarBackgroundColor, " +
@@ -93,8 +92,7 @@ namespace Framework.Database
"MinimumEmpowerKnowledge FROM artifact_tier");
// ArtifactUnlock.db2
- PrepareStatement(HotfixStatements.SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock" +
- "");
+ PrepareStatement(HotfixStatements.SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock");
// AuctionHouse.db2
PrepareStatement(HotfixStatements.SEL_AUCTION_HOUSE, "SELECT ID, Name, FactionID, DepositRate, ConsignmentRate FROM auction_house");
@@ -147,25 +145,22 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons");
// BarberShopStyle.db2
- PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style" +
- "");
+ PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style");
PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?");
// BattlePetBreedQuality.db2
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, StateMultiplier, QualityEnum FROM battle_pet_breed_quality");
// BattlePetBreedState.db2
- PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state" +
- "");
+ PrepareStatement(HotfixStatements.SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state");
// BattlePetSpecies.db2
- PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " +
- "Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID FROM battle_pet_species");
+ PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " +
+ "Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID, CovenantID FROM battle_pet_species");
PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE, "SELECT ID, Description_lang, SourceText_lang FROM battle_pet_species_locale WHERE locale = ?");
// BattlePetSpeciesState.db2
- PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state" +
- "");
+ PrepareStatement(HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state");
// BattlemasterList.db2
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " +
@@ -183,54 +178,82 @@ namespace Framework.Database
// CfgRegions.db2
PrepareStatement(HotfixStatements.SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions");
- // CharacterFacialHairStyles.db2
- PrepareStatement(HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT ID, Geoset1, Geoset2, Geoset3, Geoset4, Geoset5, RaceID, SexID, VariationID" +
- " FROM character_facial_hair_styles");
-
- // CharBaseSection.db2
- PrepareStatement(HotfixStatements.SEL_CHAR_BASE_SECTION, "SELECT ID, LayoutResType, VariationEnum, ResolutionVariationEnum FROM char_base_section" +
- "");
-
- // CharSections.db2
- PrepareStatement(HotfixStatements.SEL_CHAR_SECTIONS, "SELECT ID, RaceID, SexID, BaseSection, VariationIndex, ColorIndex, Flags, MaterialResourcesID1, " +
- "MaterialResourcesID2, MaterialResourcesID3 FROM char_sections");
-
- // CharStartOutfit.db2
- PrepareStatement(HotfixStatements.SEL_CHAR_START_OUTFIT, "SELECT ID, ClassID, SexID, OutfitID, PetDisplayID, PetFamilyID, ItemID1, ItemID2, ItemID3, " +
- "ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, " +
- "ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, RaceID FROM char_start_outfit");
-
// CharTitles.db2
PrepareStatement(HotfixStatements.SEL_CHAR_TITLES, "SELECT ID, Name, Name1, MaskID, Flags FROM char_titles");
PrepareStatement(HotfixStatements.SEL_CHAR_TITLES_LOCALE, "SELECT ID, Name_lang, Name1_lang FROM char_titles_locale WHERE locale = ?");
+ // CharacterLoadout.db2
+ PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT, "SELECT RaceMask, ID, ChrClassID, Purpose FROM character_loadout");
+
+ // CharacterLoadoutItem.db2
+ PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT_ITEM, "SELECT ID, CharacterLoadoutID, ItemID FROM character_loadout_item");
+
// ChatChannels.db2
- PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS, "SELECT ID, Name, Shortcut, Flags, FactionGroup FROM chat_channels");
+ PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS, "SELECT Name, Shortcut, ID, Flags, FactionGroup, Ruleset FROM chat_channels");
PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS_LOCALE, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?");
// ChrClasses.db2
- PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " +
- "SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, SpellTextureBlobFileDataID, Flags, CinematicSequenceID, " +
- "DefaultSpec, PrimaryStatPriority, DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet" +
- " FROM chr_classes");
- PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale WHERE locale = ?");
+ PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " +
+ "HyphenatedNameMale, HyphenatedNameFemale, ID, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " +
+ "SpellTextureBlobFileDataID, RolesMask, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " +
+ "MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " +
+ "CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " +
+ "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, DisplayPower, " +
+ "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ChatColorR, ChatColorG, ChatColorB FROM chr_classes");
+ PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " +
+ "DisabledString_lang, HyphenatedNameMale_lang, HyphenatedNameFemale_lang FROM chr_classes_locale WHERE locale = ?");
// ChrClassesXPowerTypes.db2
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, PowerType, ClassID FROM chr_classes_x_power_types");
+ // ChrCustomizationChoice.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, SortOrder, SwatchColor1, " +
+ "SwatchColor2, UiOrderIndex, Flags FROM chr_customization_choice");
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE, "SELECT ID, Name_lang FROM chr_customization_choice_locale WHERE locale = ?");
+
+ // ChrCustomizationDisplayInfo.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " +
+ "BarberShopHeightOffset FROM chr_customization_display_info");
+
+ // ChrCustomizationElement.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " +
+ "ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " +
+ "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID FROM chr_customization_element");
+
+ // ChrCustomizationOption.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " +
+ "OptionType, BarberShopCostModifier, ChrCustomizationID, ChrCustomizationReqID, UiOrderIndex FROM chr_customization_option");
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION_LOCALE, "SELECT ID, Name_lang FROM chr_customization_option_locale WHERE locale = ?");
+
+ // ChrCustomizationReq.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, Flags, ClassMask, AchievementID, OverrideArchive, ItemModifiedAppearanceID FROM chr_customization_req");
+
+ // ChrCustomizationReqChoice.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ_CHOICE, "SELECT ID, ChrCustomizationChoiceID, ChrCustomizationReqID FROM chr_customization_req_choice");
+
+ // ChrModel.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_MODEL, "SELECT FaceCustomizationOffset1, FaceCustomizationOffset2, FaceCustomizationOffset3, CustomizeOffset1, " +
+ "CustomizeOffset2, CustomizeOffset3, ID, Sex, DisplayID, CharComponentTextureLayoutID, Flags, SkeletonFileDataID, ModelFallbackChrModelID, " +
+ "TextureFallbackChrModelID, HelmVisFallbackChrModelID, CustomizeScale, CustomizeFacing, CameraDistanceOffset, BarberShopCameraOffsetScale, " +
+ "BarberShopCameraRotationOffset FROM chr_model");
+
+ // ChrRaceXChrModel.db2
+ PrepareStatement(HotfixStatements.SEL_CHR_RACE_X_CHR_MODEL, "SELECT ID, ChrRacesID, ChrModelID FROM chr_race_x_chr_model");
+
// ChrRaces.db2
- PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, ID, Flags, " +
- "MaleDisplayId, FemaleDisplayId, HighResMaleDisplayId, HighResFemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, " +
- "MaleCustomizeOffset1, MaleCustomizeOffset2, MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, " +
- "LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " +
- "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " +
- "UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, TransmogrifyDisabledSlotMask, FactionID, " +
- "CinematicSequenceID, ResSicknessSpellID, SplashSoundID, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, " +
- "CharComponentTextureLayoutID, CharComponentTexLayoutHiResID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, " +
- "FemaleModelFallbackRaceID, FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, " +
- "FemaleTextureFallbackSex FROM chr_races");
- PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" +
- " FROM chr_races_locale WHERE locale = ?");
+ PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, NameS, " +
+ "NameFemaleS, NameLowercaseS, NameFemaleLowercaseS, RaceFantasyDescription, NameL, NameFemaleL, NameLowercaseL, NameFemaleLowercaseL, ID, " +
+ "Flags, BaseLanguage, ResSicknessSpellID, SplashSoundID, CreateScreenFileDataID, SelectScreenFileDataID, LowResScreenFileDataID, " +
+ "AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, " +
+ "AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, UiDisplayOrder, PlayableRaceBit, " +
+ "HelmetAnimScalingRaceID, TransmogrifyDisabledSlotMask, AlteredFormCustomizeOffsetFallback1, AlteredFormCustomizeOffsetFallback2, " +
+ "AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, FactionID, CinematicSequenceID, CreatureType, Alliance, " +
+ "RaceRelated, UnalteredVisualRaceID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " +
+ "FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex, " +
+ "UnalteredVisualCustomizationRaceID FROM chr_races");
+ PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, NameS_lang, " +
+ "NameFemaleS_lang, NameLowercaseS_lang, NameFemaleLowercaseS_lang, RaceFantasyDescription_lang, NameL_lang, NameFemaleL_lang, " +
+ "NameLowercaseL_lang, NameFemaleLowercaseL_lang FROM chr_races_locale WHERE locale = ?");
// ChrSpecialization.db2
PrepareStatement(HotfixStatements.SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " +
@@ -239,15 +262,14 @@ namespace Framework.Database
" WHERE locale = ?");
// CinematicCamera.db2
- PrepareStatement(HotfixStatements.SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera" +
- "");
+ PrepareStatement(HotfixStatements.SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera");
// CinematicSequences.db2
- PrepareStatement(HotfixStatements.SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" +
- " FROM cinematic_sequences");
+ PrepareStatement(HotfixStatements.SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8 FROM cinematic_sequences");
// ContentTuning.db2
- PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpansionID FROM content_tuning");
+ PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, " +
+ "TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel FROM content_tuning");
// ContentTuningXExpected.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MythicPlusSeasonID, ContentTuningID" +
@@ -268,9 +290,8 @@ namespace Framework.Database
"TextureVariationFileDataID3 FROM creature_display_info");
// CreatureDisplayInfoExtra.db2
- PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, " +
- "HairColorID, FacialHairID, Flags, BakeMaterialResourcesID, HDBakeMaterialResourcesID, CustomDisplayOption1, CustomDisplayOption2, " +
- "CustomDisplayOption3 FROM creature_display_info_extra");
+ PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, Flags, BakeMaterialResourcesID, " +
+ "HDBakeMaterialResourcesID FROM creature_display_info_extra");
// CreatureFamily.db2
PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " +
@@ -294,33 +315,29 @@ namespace Framework.Database
"EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria");
// CriteriaTree.db2
- PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree" +
- "");
+ PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree");
PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE_LOCALE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?");
// CurrencyTypes.db2
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " +
- "MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID, ConvertToPlayerExperience, PlayerConditionID FROM currency_types" +
- "");
+ "MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, Flags1, Flags2 FROM currency_types");
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?");
// Curve.db2
PrepareStatement(HotfixStatements.SEL_CURVE, "SELECT ID, Type, Flags FROM curve");
// CurvePoint.db2
- PrepareStatement(HotfixStatements.SEL_CURVE_POINT, "SELECT ID, PosX, PosY, CurveID, OrderIndex FROM curve_point");
+ PrepareStatement(HotfixStatements.SEL_CURVE_POINT, "SELECT ID, PosX, PosY, PosPreSquishX, PosPreSquishY, CurveID, OrderIndex FROM curve_point");
// DestructibleModelData.db2
- PrepareStatement(HotfixStatements.SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State1Wmo, " +
- "State1DestructionDoodadSet, State1ImpactEffectDoodadSet, State1AmbientDoodadSet, State2Wmo, State2DestructionDoodadSet, " +
- "State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State3Wmo, State3InitDoodadSet, State3AmbientDoodadSet, EjectDirection, DoNotHighlight, " +
- "State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data" +
- "");
+ PrepareStatement(HotfixStatements.SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State1Wmo, " +
+ "State1DestructionDoodadSet, State1ImpactEffectDoodadSet, State1AmbientDoodadSet, State2Wmo, State2DestructionDoodadSet, " +
+ "State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State3Wmo, State3InitDoodadSet, State3AmbientDoodadSet, EjectDirection, DoNotHighlight, " +
+ "State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data");
// Difficulty.db2
PrepareStatement(HotfixStatements.SEL_DIFFICULTY, "SELECT ID, Name, InstanceType, OrderIndex, OldEnumValue, FallbackDifficultyID, MinPlayers, MaxPlayers, " +
- "Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty" +
- "");
+ "Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty");
PrepareStatement(HotfixStatements.SEL_DIFFICULTY_LOCALE, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?");
// DungeonEncounter.db2
@@ -406,9 +423,8 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER, "SELECT HordeSourceText, AllianceSourceText, TitleName, ID, GarrTypeID, GarrFollowerTypeID, " +
"HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " +
"FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " +
- "HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " +
- "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender FROM garr_follower" +
- "");
+ "HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " +
+ "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender, AutoCombatantID, CovenantID FROM garr_follower");
PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER_LOCALE, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, TitleName_lang FROM garr_follower_locale" +
" WHERE locale = ?");
@@ -435,14 +451,13 @@ namespace Framework.Database
" FROM garr_site_level_plot_inst");
// GemProperties.db2
- PrepareStatement(HotfixStatements.SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type, MinItemLevel FROM gem_properties");
+ PrepareStatement(HotfixStatements.SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type FROM gem_properties");
// GlyphBindableSpell.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell");
// GlyphProperties.db2
- PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, GlyphType, GlyphExclusiveCategoryID, SpellIconFileDataID FROM glyph_properties" +
- "");
+ PrepareStatement(HotfixStatements.SEL_GLYPH_PROPERTIES, "SELECT ID, SpellID, GlyphType, GlyphExclusiveCategoryID, SpellIconFileDataID FROM glyph_properties");
// GlyphRequiredSpec.db2
PrepareStatement(HotfixStatements.SEL_GLYPH_REQUIRED_SPEC, "SELECT ID, ChrSpecializationID, GlyphPropertiesID FROM glyph_required_spec");
@@ -470,12 +485,10 @@ namespace Framework.Database
"Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " +
"Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, Date17, Date18, Date19, Date20, Date21, Date22, " +
"Date23, Date24, Date25, Date26, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, " +
- "CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays" +
- "");
+ "CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays");
// ImportPriceArmor.db2
- PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" +
- "");
+ PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor");
// ImportPriceQuality.db2
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_QUALITY, "SELECT ID, Data FROM import_price_quality");
@@ -487,12 +500,11 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Data FROM import_price_weapon");
// Item.db2
- PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " +
- "ItemGroupSoundsID FROM item");
+ PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " +
+ "ItemGroupSoundsID, ModifiedCraftingReagentItemID FROM item");
// ItemAppearance.db2
- PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" +
- "");
+ PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder, PlayerConditionID FROM item_appearance");
// ItemArmorQuality.db2
PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " +
@@ -510,8 +522,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_ITEM_BAG_FAMILY_LOCALE, "SELECT ID, Name_lang FROM item_bag_family_locale WHERE locale = ?");
// ItemBonus.db2
- PrepareStatement(HotfixStatements.SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, ParentItemBonusListID, Type, OrderIndex FROM item_bonus" +
- "");
+ PrepareStatement(HotfixStatements.SEL_ITEM_BONUS, "SELECT ID, Value1, Value2, Value3, Value4, ParentItemBonusListID, Type, OrderIndex FROM item_bonus");
// ItemBonusListLevelDelta.db2
PrepareStatement(HotfixStatements.SEL_ITEM_BONUS_LIST_LEVEL_DELTA, "SELECT ItemLevelDelta, ID FROM item_bonus_list_level_delta");
@@ -521,8 +532,7 @@ namespace Framework.Database
"ParentItemBonusTreeID FROM item_bonus_tree_node");
// ItemChildEquipment.db2
- PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment" +
- "");
+ PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment");
// ItemClass.db2
PrepareStatement(HotfixStatements.SEL_ITEM_CLASS, "SELECT ID, ClassName, ClassID, PriceModifier, Flags FROM item_class");
@@ -603,33 +613,32 @@ namespace Framework.Database
// ItemSet.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SET, "SELECT ID, Name, SetFlags, RequiredSkill, RequiredSkillRank, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " +
- "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set" +
- "");
+ "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set");
PrepareStatement(HotfixStatements.SEL_ITEM_SET_LOCALE, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?");
// ItemSetSpell.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, Threshold, ItemSetID FROM item_set_spell");
// ItemSparse.db2
- PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, DmgVariance, " +
- "DurationInInventory, QualityModifier, BagFamily, ItemRange, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, " +
- "StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, " +
- "StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " +
- "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " +
- "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " +
- "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " +
- "TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, " +
- "MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, " +
- "SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " +
- "StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " +
- "StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " +
- "RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse");
+ PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, DmgVariance, " +
+ "DurationInInventory, QualityModifier, BagFamily, ItemRange, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, " +
+ "StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, " +
+ "StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " +
+ "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " +
+ "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " +
+ "FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " +
+ "RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, " +
+ "ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, " +
+ "AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, " +
+ "PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, " +
+ "StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, " +
+ "StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, " +
+ "InventoryType, OverallQualityID FROM item_sparse");
PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" +
" FROM item_sparse_locale WHERE locale = ?");
// ItemSpec.db2
- PrepareStatement(HotfixStatements.SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec" +
- "");
+ PrepareStatement(HotfixStatements.SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec");
// ItemSpecOverride.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override");
@@ -639,20 +648,18 @@ namespace Framework.Database
// Keychain.db2
PrepareStatement(HotfixStatements.SEL_KEYCHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " +
- "Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain" +
- "");
+ "Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain");
// LfgDungeons.db2
- PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, MinLevel, MaxLevel, TypeID, Subtype, Faction, IconTextureFileID, " +
- "RewardsBgTextureFileID, PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, " +
- "TargetLevel, TargetLevelMin, TargetLevelMax, RandomID, ScenarioID, FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, " +
- "MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, MentorCharLevel, Flags1, Flags2 FROM lfg_dungeons");
+ PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, TypeID, Subtype, Faction, IconTextureFileID, RewardsBgTextureFileID, " +
+ "PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, RandomID, ScenarioID, " +
+ "FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, " +
+ "MentorCharLevel, ContentTuningID, Flags1, Flags2 FROM lfg_dungeons");
PrepareStatement(HotfixStatements.SEL_LFG_DUNGEONS_LOCALE, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?");
// Light.db2
PrepareStatement(HotfixStatements.SEL_LIGHT, "SELECT ID, GameCoordsX, GameCoordsY, GameCoordsZ, GameFalloffStart, GameFalloffEnd, ContinentID, " +
- "LightParamsID1, LightParamsID2, LightParamsID3, LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light" +
- "");
+ "LightParamsID1, LightParamsID2, LightParamsID3, LightParamsID4, LightParamsID5, LightParamsID6, LightParamsID7, LightParamsID8 FROM light");
// LiquidType.db2
PrepareStatement(HotfixStatements.SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, " +
@@ -663,7 +670,7 @@ namespace Framework.Database
"Coefficient3, Coefficient4 FROM liquid_type");
// Lock.db2
- PrepareStatement(HotfixStatements.SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " +
+ PrepareStatement(HotfixStatements.SEL_LOCK, "SELECT ID, Flags, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " +
"Skill5, Skill6, Skill7, Skill8, Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Action1, Action2, Action3, Action4, Action5, " +
"Action6, Action7, Action8 FROM `lock`");
@@ -672,9 +679,9 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_MAIL_TEMPLATE_LOCALE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?");
// Map.db2
- PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " +
- "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " +
- "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map");
+ PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, InternalName, MapDescription0, MapDescription1, PvpShortDescription, " +
+ "PvpLongDescription, CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, " +
+ "CosmeticParentMapID, TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map");
PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " +
"PvpLongDescription_lang FROM map_locale WHERE locale = ?");
@@ -684,8 +691,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_MAP_DIFFICULTY_LOCALE, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?");
// ModifierTree.db2
- PrepareStatement(HotfixStatements.SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree" +
- "");
+ PrepareStatement(HotfixStatements.SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree");
// Mount.db2
PrepareStatement(HotfixStatements.SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " +
@@ -697,8 +703,7 @@ namespace Framework.Database
"ReqMapID, PlayerConditionID FROM mount_capability");
// MountTypeXCapability.db2
- PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" +
- "");
+ PrepareStatement(HotfixStatements.SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability");
// MountXDisplay.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_X_DISPLAY, "SELECT ID, CreatureDisplayInfoID, PlayerConditionID, MountID FROM mount_x_display");
@@ -719,8 +724,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_NAMES_RESERVED_LOCALE, "SELECT ID, Name, LocaleMask FROM names_reserved_locale");
// NumTalentsAtLevel.db2
- PrepareStatement(HotfixStatements.SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level" +
- "");
+ PrepareStatement(HotfixStatements.SEL_NUM_TALENTS_AT_LEVEL, "SELECT ID, NumTalents, NumTalentsDeathKnight, NumTalentsDemonHunter FROM num_talents_at_level");
// OverrideSpellData.db2
PrepareStatement(HotfixStatements.SEL_OVERRIDE_SPELL_DATA, "SELECT ID, Spells1, Spells2, Spells3, Spells4, Spells5, Spells6, Spells7, Spells8, Spells9, " +
@@ -733,23 +737,23 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group");
// PlayerCondition.db2
- PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, MinLevel, MaxLevel, ClassMask, SkillLogic, LanguageID, " +
- "MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " +
- "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " +
- "LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " +
- "MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " +
- "PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " +
- "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, SkillID1, SkillID2, SkillID3, " +
- "SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, " +
- "MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, " +
- "CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, " +
- "CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, " +
- "ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, " +
- "AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, LfgStatus1, " +
- "LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, " +
- "CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, " +
- "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2" +
- " FROM player_condition");
+ PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, ClassMask, SkillLogic, LanguageID, MinLanguage, " +
+ "MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " +
+ "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " +
+ "LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " +
+ "MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " +
+ "PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " +
+ "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, ContentTuningID, CovenantID, " +
+ "SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, " +
+ "MinFactionID1, MinFactionID2, MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, " +
+ "PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, " +
+ "CurrentCompletedQuestID3, CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, " +
+ "ItemCount2, ItemCount3, ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, " +
+ "AuraStacks2, AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, " +
+ "LfgStatus1, LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, " +
+ "LfgValue4, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, " +
+ "QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, " +
+ "MovementFlags2 FROM player_condition");
PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION_LOCALE, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?");
// PowerDisplay.db2
@@ -813,16 +817,11 @@ namespace Framework.Database
"TreasurePickerID FROM reward_pack");
// RewardPackXCurrencyType.db2
- PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE, "SELECT ID, CurrencyTypeID, Quantity, RewardPackID FROM reward_pack_x_currency_type" +
- "");
+ PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE, "SELECT ID, CurrencyTypeID, Quantity, RewardPackID FROM reward_pack_x_currency_type");
// RewardPackXItem.db2
PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_ITEM, "SELECT ID, ItemID, ItemQuantity, RewardPackID FROM reward_pack_x_item");
- // ScalingStatDistribution.db2
- PrepareStatement(HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" +
- " FROM scaling_stat_distribution");
-
// Scenario.db2
PrepareStatement(HotfixStatements.SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Type, Flags, UiTextureKitID FROM scenario");
PrepareStatement(HotfixStatements.SEL_SCENARIO_LOCALE, "SELECT ID, Name_lang FROM scenario_locale WHERE locale = ?");
@@ -882,7 +881,7 @@ namespace Framework.Database
" FROM spell_aura_restrictions");
// SpellCastTimes.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_CAST_TIMES, "SELECT ID, Base, PerLevel, Minimum FROM spell_cast_times");
+ PrepareStatement(HotfixStatements.SEL_SPELL_CAST_TIMES, "SELECT ID, Base, Minimum FROM spell_cast_times");
// SpellCastingRequirements.db2
PrepareStatement(HotfixStatements.SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " +
@@ -893,8 +892,7 @@ namespace Framework.Database
"StartRecoveryCategory, ChargeCategory, SpellID FROM spell_categories");
// SpellCategory.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category" +
- "");
+ PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category");
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY_LOCALE, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?");
// SpellClassOptions.db2
@@ -906,7 +904,7 @@ namespace Framework.Database
" FROM spell_cooldowns");
// SpellDuration.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration");
+ PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration FROM spell_duration");
// SpellEffect.db2
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, " +
@@ -929,10 +927,10 @@ namespace Framework.Database
"ChannelInterruptFlags1, ChannelInterruptFlags2, SpellID FROM spell_interrupts");
// SpellItemEnchantment.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
- "EffectScalingPoints2, EffectScalingPoints3, TransmogPlayerConditionID, TransmogCost, IconFileDataID, EffectPointsMin1, EffectPointsMin2, " +
- "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " +
- "ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment");
+ PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT Name, HordeName, ID, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
+ "EffectScalingPoints2, EffectScalingPoints3, IconFileDataID, MinItemLevel, MaxItemLevel, TransmogUseConditionID, TransmogCost, " +
+ "EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, " +
+ "Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment");
PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale WHERE locale = ?");
// SpellItemEnchantmentCondition.db2
@@ -945,14 +943,13 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_SPELL_LEARN_SPELL, "SELECT ID, SpellID, LearnSpellID, OverridesSpellID FROM spell_learn_spell");
// SpellLevels.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, BaseLevel, MaxLevel, SpellLevel, MaxPassiveAuraLevel, SpellID" +
- " FROM spell_levels");
+ PrepareStatement(HotfixStatements.SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, MaxLevel, MaxPassiveAuraLevel, BaseLevel, SpellLevel, SpellID FROM spell_levels");
// SpellMisc.db2
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " +
- "Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, DifficultyID, CastingTimeIndex, " +
- "DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, SpellID" +
- " FROM spell_misc");
+ "Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, Attributes15, DifficultyID, " +
+ "CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, " +
+ "ContentTuningID, ShowFutureSpellPlayerConditionID, SpellVisualScript, ActiveSpellVisualScript, SpellID FROM spell_misc");
// SpellName.db2
PrepareStatement(HotfixStatements.SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name");
@@ -969,8 +966,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute");
// SpellProcsPerMinuteMod.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" +
- "");
+ PrepareStatement(HotfixStatements.SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod");
// SpellRadius.db2
PrepareStatement(HotfixStatements.SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius");
@@ -982,12 +978,10 @@ namespace Framework.Database
// SpellReagents.db2
PrepareStatement(HotfixStatements.SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " +
- "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents" +
- "");
+ "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents");
// SpellScaling.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling" +
- "");
+ PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling");
// SpellShapeshift.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " +
@@ -1012,7 +1006,7 @@ namespace Framework.Database
" FROM spell_visual_kit");
// SpellXSpellVisual.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " +
+ PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Priority, SpellIconFileID, " +
"ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" +
" FROM spell_x_spell_visual");
@@ -1052,6 +1046,9 @@ namespace Framework.Database
// TransmogHoliday.db2
PrepareStatement(HotfixStatements.SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday");
+ // TransmogIllusion.db2
+ PrepareStatement(HotfixStatements.SEL_TRANSMOG_ILLUSION, "SELECT ID, UnlockConditionID, TransmogCost, SpellItemEnchantmentID, Flags FROM transmog_illusion");
+
// TransmogSet.db2
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " +
"ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder, PlayerConditionID FROM transmog_set");
@@ -1065,16 +1062,14 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_ITEM, "SELECT ID, TransmogSetID, ItemModifiedAppearanceID, Flags FROM transmog_set_item");
// TransportAnimation.db2
- PrepareStatement(HotfixStatements.SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation" +
- "");
+ PrepareStatement(HotfixStatements.SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation");
// TransportRotation.db2
- PrepareStatement(HotfixStatements.SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation" +
- "");
+ PrepareStatement(HotfixStatements.SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation");
// UiMap.db2
- PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " +
- "BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup FROM ui_map");
+ PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, `System`, Type, BountySetID, BountyDisplayLocation, " +
+ "VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup, ContentTuningID FROM ui_map");
PrepareStatement(HotfixStatements.SEL_UI_MAP_LOCALE, "SELECT ID, Name_lang FROM ui_map_locale WHERE locale = ?");
// UiMapAssignment.db2
@@ -1083,7 +1078,7 @@ namespace Framework.Database
// UiMapLink.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, " +
- "OverrideHighlightFileDataID, OverrideHighlightAtlasID FROM ui_map_link");
+ "OverrideHighlightFileDataID, OverrideHighlightAtlasID, Flags FROM ui_map_link");
// UiMapXMapArt.db2
PrepareStatement(HotfixStatements.SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art");
@@ -1096,10 +1091,10 @@ namespace Framework.Database
" WHERE locale = ?");
// Vehicle.db2
- PrepareStatement(HotfixStatements.SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " +
- "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, UiLocomotionType, " +
- "VehicleUIIndicatorID, MissileTargetingID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, PowerDisplayID1, " +
- "PowerDisplayID2, PowerDisplayID3 FROM vehicle");
+ PrepareStatement(HotfixStatements.SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " +
+ "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, " +
+ "VehicleUIIndicatorID, MissileTargetingID, VehiclePOITypeID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, " +
+ "PowerDisplayID1, PowerDisplayID2, PowerDisplayID3 FROM vehicle");
// VehicleSeat.db2
PrepareStatement(HotfixStatements.SEL_VEHICLE_SEAT, "SELECT ID, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, CameraOffsetX, CameraOffsetY, " +
@@ -1228,17 +1223,13 @@ namespace Framework.Database
SEL_CFG_REGIONS,
- SEL_CHARACTER_FACIAL_HAIR_STYLES,
-
- SEL_CHAR_BASE_SECTION,
-
- SEL_CHAR_SECTIONS,
-
- SEL_CHAR_START_OUTFIT,
-
SEL_CHAR_TITLES,
SEL_CHAR_TITLES_LOCALE,
+ SEL_CHARACTER_LOADOUT,
+
+ SEL_CHARACTER_LOADOUT_ITEM,
+
SEL_CHAT_CHANNELS,
SEL_CHAT_CHANNELS_LOCALE,
@@ -1247,6 +1238,24 @@ namespace Framework.Database
SEL_CHR_CLASSES_X_POWER_TYPES,
+ SEL_CHR_CUSTOMIZATION_CHOICE,
+ SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE,
+
+ SEL_CHR_CUSTOMIZATION_DISPLAY_INFO,
+
+ SEL_CHR_CUSTOMIZATION_ELEMENT,
+
+ SEL_CHR_CUSTOMIZATION_OPTION,
+ SEL_CHR_CUSTOMIZATION_OPTION_LOCALE,
+
+ SEL_CHR_CUSTOMIZATION_REQ,
+
+ SEL_CHR_CUSTOMIZATION_REQ_CHOICE,
+
+ SEL_CHR_MODEL,
+
+ SEL_CHR_RACE_X_CHR_MODEL,
+
SEL_CHR_RACES,
SEL_CHR_RACES_LOCALE,
@@ -1544,8 +1553,6 @@ namespace Framework.Database
SEL_REWARD_PACK_X_ITEM,
- SEL_SCALING_STAT_DISTRIBUTION,
-
SEL_SCENARIO,
SEL_SCENARIO_LOCALE,
@@ -1668,6 +1675,8 @@ namespace Framework.Database
SEL_TRANSMOG_HOLIDAY,
+ SEL_TRANSMOG_ILLUSION,
+
SEL_TRANSMOG_SET,
SEL_TRANSMOG_SET_LOCALE,
diff --git a/Source/Game/Achievements/AchievementManager.cs b/Source/Game/Achievements/AchievementManager.cs
index 9780fb2f8..574ab5d81 100644
--- a/Source/Game/Achievements/AchievementManager.cs
+++ b/Source/Game/Achievements/AchievementManager.cs
@@ -84,6 +84,12 @@ namespace Game.Achievements
return false;
}
+ if (achievement.CovenantID != 0 && referencePlayer.m_playerData.CovenantID != achievement.CovenantID)
+ {
+ Log.outTrace(LogFilter.Achievement, $"CanUpdateCriteriaTree: (Id: {criteria.Id} Type {criteria.Entry.Type} Achievement {achievement.Id}) Wrong covenant");
+ return false;
+ }
+
return base.CanUpdateCriteriaTree(criteria, tree, referencePlayer);
}
@@ -535,7 +541,7 @@ namespace Game.Achievements
//! Since no common attributes were found, (not even in titleRewardFlags field)
//! we explicitly check by ID. Maybe in the future we could move the achievement_reward
//! condition fields to the condition system.
- uint titleId = reward.TitleId[achievement.Id == 1793 ? _owner.m_playerData.NativeSex : (_owner.GetTeam() == Team.Alliance ? 0 : 1)];
+ uint titleId = reward.TitleId[achievement.Id == 1793 ? (int)_owner.GetNativeSex() : (_owner.GetTeam() == Team.Alliance ? 0 : 1)];
if (titleId != 0)
{
CharTitlesRecord titleEntry = CliDB.CharTitlesStorage.LookupByKey(titleId);
diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs
index 27112acc8..c98144054 100644
--- a/Source/Game/Achievements/CriteriaHandler.cs
+++ b/Source/Game/Achievements/CriteriaHandler.cs
@@ -138,6 +138,10 @@ namespace Game.Achievements
case CriteriaTypes.OwnBattlePetCount:
case CriteriaTypes.HonorLevelReached:
case CriteriaTypes.PrestigeReached:
+ case CriteriaTypes.CompleteQuestAccumulate:
+ case CriteriaTypes.BoughtItemFromVendor:
+ case CriteriaTypes.SoldItemToVendor:
+ case CriteriaTypes.TravelledToArea:
SetCriteriaProgress(criteria, 1, referencePlayer, ProgressType.Accumulate);
break;
// std case: increment at miscValue1
@@ -437,6 +441,9 @@ namespace Game.Achievements
case CriteriaTypes.EarnHonorXp:
case CriteriaTypes.RelicTalentUnlocked:
case CriteriaTypes.ReachAccountHonorLevel:
+ case CriteriaTypes.MythicKeystoneCompleted:
+ case CriteriaTypes.ApplyConduit:
+ case CriteriaTypes.ConvertItemsToCurrency:
break; // Not implemented yet :(
}
@@ -812,6 +819,10 @@ namespace Game.Achievements
case CriteriaTypes.ReachAccountHonorLevel:
case CriteriaTypes.HeartOfAzerothArtifactPowerEarned:
case CriteriaTypes.HeartOfAzerothLevelReached:
+ case CriteriaTypes.CompleteQuestAccumulate:
+ case CriteriaTypes.BoughtItemFromVendor:
+ case CriteriaTypes.SoldItemToVendor:
+ case CriteriaTypes.TravelledToArea:
return progress.Counter >= requiredAmount;
case CriteriaTypes.CompleteAchievement:
case CriteriaTypes.CompleteQuest:
@@ -942,6 +953,9 @@ namespace Game.Achievements
case CriteriaTypes.WinDuel:
case CriteriaTypes.WinRatedArena:
case CriteriaTypes.WonAuctions:
+ case CriteriaTypes.CompleteQuestAccumulate:
+ case CriteriaTypes.BoughtItemFromVendor:
+ case CriteriaTypes.SoldItemToVendor:
if (miscValue1 == 0)
return false;
break;
@@ -1188,6 +1202,10 @@ namespace Game.Achievements
if (miscValue1 != criteria.Entry.Asset)
return false;
break;
+ case CriteriaTypes.TravelledToArea:
+ if (miscValue1 != criteria.Entry.Asset)
+ return false;
+ break;
default:
break;
}
@@ -1227,8 +1245,8 @@ namespace Game.Achievements
bool ModifierSatisfied(ModifierTreeRecord modifier, ulong miscValue1, ulong miscValue2, Unit unit, Player referencePlayer)
{
uint reqValue = modifier.Asset;
- int secondaryAsset = modifier.SecondaryAsset;
- int tertiaryAsset = modifier.TertiaryAsset;
+ int secondaryAsset = modifier.SecondaryAsset;
+ int tertiaryAsset = modifier.TertiaryAsset;
switch ((CriteriaAdditionalCondition)modifier.Type)
{
@@ -1621,7 +1639,7 @@ namespace Game.Achievements
return false;
break;
case CriteriaAdditionalCondition.SourceNativeSex: // 98
- if (referencePlayer.m_playerData.NativeSex != reqValue)
+ if (referencePlayer.GetNativeSex() != (Gender)reqValue)
return false;
break;
case CriteriaAdditionalCondition.Skill: // 99
@@ -1656,7 +1674,7 @@ namespace Game.Achievements
uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(reqValue);
if (questBit != 0)
if ((referencePlayer.m_activePlayerData.QuestCompleted[((int)questBit - 1) >> 6] & (1ul << (((int)questBit - 1) & 63))) == 0)
- return false;
+ return false;
break;
case CriteriaAdditionalCondition.CompletedQuest: // 111
if (referencePlayer.GetQuestStatus(reqValue) != QuestStatus.Complete)
@@ -2402,7 +2420,7 @@ namespace Game.Achievements
break;
}
case CriteriaAdditionalCondition.SourceLevel120: // 264
- if (referencePlayer.GetLevel() != 120)
+ if (referencePlayer.GetLevel() != 60)
return false;
break;
case CriteriaAdditionalCondition.SelectedAzeriteEssenceRankLower: // 266
@@ -2441,8 +2459,54 @@ namespace Game.Achievements
}
}
}
+ return false;
+ }
+ case CriteriaAdditionalCondition.SourceLevelInRangeCt: // 268
+ {
+ uint level = referencePlayer.GetLevel();
+ var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
+ if (levels.HasValue)
+ {
+ if (secondaryAsset != 0)
+ return level >= levels.Value.MinLevelWithDelta && level <= levels.Value.MaxLevelWithDelta;
+ return level >= levels.Value.MinLevel && level <= levels.Value.MaxLevel;
+ }
+ return false;
+ }
+ case CriteriaAdditionalCondition.TargetLevelInRangeCt: // 269
+ {
+ if (!unit)
+ return false;
+
+ uint level = unit.GetLevel();
+ var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
+ if (levels.HasValue)
+ {
+ if (secondaryAsset != 0)
+ return level >= levels.Value.MinLevelWithDelta && level <= levels.Value.MaxLevelWithDelta;
+ return level >= levels.Value.MinLevel && level <= levels.Value.MaxLevel;
+ }
+ return false;
+ }
+ case CriteriaAdditionalCondition.SourceLevelGreaterCt: // 272
+ {
+ uint level = referencePlayer.GetLevel();
+ var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
+ if (levels.HasValue)
+ return secondaryAsset != 0 ? level >= levels.Value.MinLevelWithDelta : level >= levels.Value.MinLevel;
+ return false;
+ }
+ case CriteriaAdditionalCondition.TargetLevelGreaterCt: // 273
+ {
+ if (!unit)
+ return false;
+
+ uint level = unit.GetLevel();
+ var levels = Global.DB2Mgr.GetContentTuningData(reqValue, 0);
+ if (levels.HasValue)
+ return secondaryAsset != 0 ? level >= levels.Value.MinLevelWithDelta : level >= levels.Value.MinLevel;
+ return false;
}
- return false;
case CriteriaAdditionalCondition.MapOrCosmeticMap: // 280
{
MapRecord map = referencePlayer.GetMap().GetEntry();
@@ -2450,6 +2514,60 @@ namespace Game.Achievements
return false;
break;
}
+ case CriteriaAdditionalCondition.Covenant: // 288
+ if (referencePlayer.m_playerData.CovenantID != reqValue)
+ return false;
+ break;
+ case CriteriaAdditionalCondition.Soulbind: // 291
+ if (referencePlayer.m_playerData.SoulbindID != reqValue)
+ return false;
+ break;
+ case CriteriaAdditionalCondition.SourceAreaOrZoneInGroup: // 293
+ {
+ var areas = Global.DB2Mgr.GetAreasForGroup(reqValue);
+ AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(referencePlayer.GetAreaId());
+ if (area != null)
+ foreach (uint areaInGroup in areas)
+ if (areaInGroup == area.Id || areaInGroup == area.ParentAreaID)
+ return true;
+ return false;
+ }
+ case CriteriaAdditionalCondition.SourceInSpecificChromieTime: // 300
+ if (referencePlayer.m_activePlayerData.UiChromieTimeExpansionID != reqValue)
+ return false;
+ break;
+ case CriteriaAdditionalCondition.SourceInAnyChromieTime: // 301
+ if (referencePlayer.m_activePlayerData.UiChromieTimeExpansionID == 0)
+ return false;
+ break;
+ case CriteriaAdditionalCondition.SourceRuneforgeLegendaryKnown: // 303
+ {
+ int block = (int)reqValue / 32;
+ if (block >= referencePlayer.m_activePlayerData.RuneforgePowers.Size())
+ return false;
+
+ uint bit = reqValue % 32;
+ return (referencePlayer.m_activePlayerData.RuneforgePowers[block] & (1u << (int)bit)) != 0;
+ }
+ case CriteriaAdditionalCondition.ShapeshiftFormCustomizationDisplay: // 308
+ {
+ ShapeshiftFormModelData formModelData = Global.DB2Mgr.GetShapeshiftFormModelData(referencePlayer.GetRace(), referencePlayer.GetNativeSex(), (ShapeShiftForm)secondaryAsset);
+ if (formModelData == null)
+ return false;
+
+ uint formChoice = referencePlayer.GetCustomizationChoice(formModelData.OptionID);
+ var choiceIndex = formModelData.Choices.FindIndex(choice => { return choice.Id == formChoice; });
+ if (choiceIndex == -1)
+ return false;
+
+ if (reqValue != formModelData.Displays[choiceIndex].DisplayID)
+ return false;
+ break;
+ }
+ case CriteriaAdditionalCondition.SourceFlying: // 311
+ if (!referencePlayer.IsFlying())
+ return false;
+ break;
default:
break;
}
@@ -2851,7 +2969,7 @@ namespace Game.Achievements
{
return _criteriasByFailEvent[(int)condition].LookupByKey(asset);
}
-
+
public CriteriaDataSet GetCriteriaDataSet(Criteria criteria)
{
return _criteriaDataMap.LookupByKey(criteria.Id);
@@ -2917,7 +3035,7 @@ namespace Game.Achievements
}
public class CriteriaTree
- {
+ {
public uint Id;
public CriteriaTreeRecord Entry;
public AchievementRecord Achievement;
diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs
index 6ed11ce4b..0b0b90f1d 100644
--- a/Source/Game/BattleGrounds/BattleGround.cs
+++ b/Source/Game/BattleGrounds/BattleGround.cs
@@ -1552,7 +1552,7 @@ namespace Game.BattleGrounds
// creature.SetVisibleAura(0, SPELL_SPIRIT_HEAL_CHANNEL);
// casting visual effect
creature.SetChannelSpellId(BattlegroundConst.SpellSpiritHealChannel);
- creature.SetChannelSpellXSpellVisualId(BattlegroundConst.SpellSpiritHealChannelVisual);
+ creature.SetChannelVisual(new SpellCastVisual(BattlegroundConst.SpellSpiritHealChannelVisual, 0));
//creature.CastSpell(creature, SPELL_SPIRIT_HEAL_CHANNEL, true);
return true;
}
diff --git a/Source/Game/Cache/CharacterCache.cs b/Source/Game/Cache/CharacterCache.cs
index 08c0e5ff3..255cc9f8f 100644
--- a/Source/Game/Cache/CharacterCache.cs
+++ b/Source/Game/Cache/CharacterCache.cs
@@ -85,6 +85,14 @@ namespace Game.Cache
_characterCacheByNameStore[name] = characterCacheEntry;
}
+ public void UpdateCharacterGender(ObjectGuid guid, byte gender)
+ {
+ if (!_characterCacheStore.ContainsKey(guid))
+ return;
+
+ _characterCacheStore[guid].Sex = (Gender)gender;
+ }
+
public void UpdateCharacterLevel(ObjectGuid guid, byte level)
{
if (!_characterCacheStore.ContainsKey(guid))
diff --git a/Source/Game/Chat/Commands/LookupCommands.cs b/Source/Game/Chat/Commands/LookupCommands.cs
index 65fa33b29..9005d674f 100644
--- a/Source/Game/Chat/Commands/LookupCommands.cs
+++ b/Source/Game/Chat/Commands/LookupCommands.cs
@@ -23,6 +23,7 @@ using Game.Entities;
using Game.Spells;
using System;
using System.Text;
+using System.Collections.Generic;
namespace Game.Chat
{
@@ -542,11 +543,23 @@ namespace Game.Chat
}
if (handler.GetSession() != null)
- handler.SendSysMessage(CypherStrings.QuestListChat, qInfo.Id, qInfo.Id,
+ {
+ int maxLevel = 0;
+ var questLevels = Global.DB2Mgr.GetContentTuningData(qInfo.ContentTuningId, handler.GetSession().GetPlayer().m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
+ if (questLevels.HasValue)
+ maxLevel = questLevels.Value.MaxLevel;
+
+ int scalingFactionGroup = 0;
+ ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(qInfo.ContentTuningId);
+ if (contentTuning != null)
+ scalingFactionGroup = contentTuning.GetScalingFactionGroup();
+
+ handler.SendSysMessage(CypherStrings.QuestListChat, qInfo.Id, qInfo.Id,
handler.GetSession().GetPlayer().GetQuestLevel(qInfo),
handler.GetSession().GetPlayer().GetQuestMinLevel(qInfo),
- qInfo.MaxScalingLevel, qInfo.ScalingFactionGroup,
+ maxLevel, scalingFactionGroup,
title, statusStr);
+ }
else
handler.SendSysMessage(CypherStrings.QuestListConsole, qInfo.Id, title, statusStr);
@@ -594,11 +607,23 @@ namespace Game.Chat
}
if (handler.GetSession() != null)
+ {
+ int maxLevel = 0;
+ var questLevels = Global.DB2Mgr.GetContentTuningData(qInfo.ContentTuningId, handler.GetSession().GetPlayer().m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
+ if (questLevels.HasValue)
+ maxLevel = questLevels.Value.MaxLevel;
+
+ int scalingFactionGroup = 0;
+ ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(qInfo.ContentTuningId);
+ if (contentTuning != null)
+ scalingFactionGroup = contentTuning.GetScalingFactionGroup();
+
handler.SendSysMessage(CypherStrings.QuestListChat, qInfo.Id, qInfo.Id,
handler.GetSession().GetPlayer().GetQuestLevel(qInfo),
handler.GetSession().GetPlayer().GetQuestMinLevel(qInfo),
- qInfo.MaxScalingLevel, qInfo.ScalingFactionGroup,
+ maxLevel, scalingFactionGroup,
_title, statusStr);
+ }
else
handler.SendSysMessage(CypherStrings.QuestListConsole, qInfo.Id, _title, statusStr);
diff --git a/Source/Game/Chat/Commands/MiscCommands.cs b/Source/Game/Chat/Commands/MiscCommands.cs
index a47ea389b..332e56f5d 100644
--- a/Source/Game/Chat/Commands/MiscCommands.cs
+++ b/Source/Game/Chat/Commands/MiscCommands.cs
@@ -591,7 +591,7 @@ namespace Game.Chat
if (spellInfo == null)
return false;
- SpellNonMeleeDamage damageInfo = new SpellNonMeleeDamage(attacker, target, spellInfo, spellInfo.GetSpellXSpellVisualId(attacker), spellInfo.SchoolMask);
+ SpellNonMeleeDamage damageInfo = new SpellNonMeleeDamage(attacker, target, spellInfo, new Networking.Packets.SpellCastVisual(spellInfo.GetSpellXSpellVisualId(attacker), 0), spellInfo.SchoolMask);
damageInfo.damage = damage_;
attacker.DealDamageMods(damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb);
target.DealSpellDamage(damageInfo, true);
@@ -1596,7 +1596,7 @@ namespace Game.Chat
mapId = target.GetMapId();
areaId = target.GetAreaId();
alive = target.IsAlive() ? handler.GetCypherString(CypherStrings.Yes) : handler.GetCypherString(CypherStrings.No);
- gender = (Gender)(byte)target.m_playerData.NativeSex;
+ gender = target.GetNativeSex();
}
// get additional information from DB
else
@@ -2367,7 +2367,7 @@ namespace Game.Chat
if (caster)
{
ObjectGuid castId = ObjectGuid.Create(HighGuid.Cast, SpellCastSource.Normal, player.GetMapId(), SPELL_UNSTUCK_ID, player.GetMap().GenerateLowGuid(HighGuid.Cast));
- Spell.SendCastResult(caster, spellInfo, SPELL_UNSTUCK_VISUAL, castId, SpellCastResult.CantDoThatRightNow);
+ Spell.SendCastResult(caster, spellInfo, new Networking.Packets.SpellCastVisual(SPELL_UNSTUCK_VISUAL, 0), castId, SpellCastResult.CantDoThatRightNow);
}
return false;
diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs
index 6fa742fbe..bb656134d 100644
--- a/Source/Game/Conditions/ConditionManager.cs
+++ b/Source/Game/Conditions/ConditionManager.cs
@@ -1727,11 +1727,30 @@ namespace Game
public static bool IsPlayerMeetingCondition(Player player, PlayerConditionRecord condition)
{
- if (condition.MinLevel != 0 && player.GetLevel() < condition.MinLevel)
- return false;
+ ContentTuningLevels? levels = Global.DB2Mgr.GetContentTuningData(condition.ContentTuningID, player.m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
+ if (levels.HasValue)
+ {
+ byte minLevel = (byte)(condition.Flags.HasAnyFlag(0x800) ? levels.Value.MinLevelWithDelta : levels.Value.MinLevel);
+ byte maxLevel = 0;
+ if (!condition.Flags.HasAnyFlag(0x20))
+ maxLevel = (byte)(condition.Flags.HasAnyFlag(0x800) ? levels.Value.MaxLevelWithDelta : levels.Value.MaxLevel);
+ if (condition.Flags.HasAnyFlag(0x80))
+ {
+ if (minLevel != 0 && player.GetLevel() >= minLevel && (maxLevel == 0 || player.GetLevel() <= maxLevel))
+ return false;
- if (condition.MaxLevel != 0 && player.GetLevel() > condition.MaxLevel)
- return false;
+ if (maxLevel != 0 && player.GetLevel() <= maxLevel && (minLevel == 0 || player.GetLevel() >= minLevel))
+ return false;
+ }
+ else
+ {
+ if (minLevel != 0 && player.GetLevel() < minLevel)
+ return false;
+
+ if (maxLevel != 0 && player.GetLevel() > maxLevel)
+ return false;
+ }
+ }
if (condition.RaceMask != 0 && !Convert.ToBoolean(player.GetRaceMask() & condition.RaceMask))
return false;
@@ -1742,7 +1761,7 @@ namespace Game
if (condition.Gender >= 0 && (int)player.GetGender() != condition.Gender)
return false;
- if (condition.NativeGender >= 0 && player.m_playerData.NativeSex != condition.NativeGender)
+ if (condition.NativeGender >= 0 && player.GetNativeSex() != (Gender)condition.NativeGender)
return false;
if (condition.PowerType != -1 && condition.PowerTypeComp != 0)
@@ -2140,6 +2159,9 @@ namespace Game
if (condition.ModifierTreeID != 0 && !player.ModifierTreeSatisfied(condition.ModifierTreeID))
return false;
+ if (condition.CovenantID != 0 && player.m_playerData.CovenantID != condition.CovenantID)
+ return false;
+
return true;
}
diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs
index 5b9cbfb21..34fd03dee 100644
--- a/Source/Game/DataStorage/CliDB.cs
+++ b/Source/Game/DataStorage/CliDB.cs
@@ -91,14 +91,20 @@ namespace Game.DataStorage
BattlemasterListStorage = ReadDB2("BattlemasterList.db2", HotfixStatements.SEL_BATTLEMASTER_LIST, HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE);
BroadcastTextStorage = ReadDB2("BroadcastText.db2", HotfixStatements.SEL_BROADCAST_TEXT, HotfixStatements.SEL_BROADCAST_TEXT_LOCALE);
CfgRegionsStorage = ReadDB2("Cfg_Regions.db2", HotfixStatements.SEL_CFG_REGIONS);
- CharacterFacialHairStylesStorage = ReadDB2("CharacterFacialHairStyles.db2", HotfixStatements.SEL_CHARACTER_FACIAL_HAIR_STYLES);
- CharBaseSectionStorage = ReadDB2("CharBaseSection.db2", HotfixStatements.SEL_CHAR_BASE_SECTION);
- CharSectionsStorage = ReadDB2("CharSections.db2", HotfixStatements.SEL_CHAR_SECTIONS);
- CharStartOutfitStorage = ReadDB2("CharStartOutfit.db2", HotfixStatements.SEL_CHAR_START_OUTFIT);
CharTitlesStorage = ReadDB2("CharTitles.db2", HotfixStatements.SEL_CHAR_TITLES, HotfixStatements.SEL_CHAR_TITLES_LOCALE);
+ CharacterLoadoutStorage = ReadDB2("CharacterLoadout.db2", HotfixStatements.SEL_CHARACTER_LOADOUT);
+ CharacterLoadoutItemStorage = ReadDB2("CharacterLoadoutItem.db2", HotfixStatements.SEL_CHARACTER_LOADOUT_ITEM);
ChatChannelsStorage = ReadDB2("ChatChannels.db2", HotfixStatements.SEL_CHAT_CHANNELS, HotfixStatements.SEL_CHAT_CHANNELS_LOCALE);
ChrClassesStorage = ReadDB2("ChrClasses.db2", HotfixStatements.SEL_CHR_CLASSES, HotfixStatements.SEL_CHR_CLASSES_LOCALE);
ChrClassesXPowerTypesStorage = ReadDB2("ChrClassesXPowerTypes.db2", HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES);
+ ChrCustomizationChoiceStorage= ReadDB2("ChrCustomizationChoice.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE);
+ ChrCustomizationDisplayInfoStorage= ReadDB2("ChrCustomizationDisplayInfo.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO);
+ ChrCustomizationElementStorage =ReadDB2("ChrCustomizationElement.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT);
+ ChrCustomizationOptionStorage =ReadDB2("ChrCustomizationOption.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION_LOCALE);
+ ChrCustomizationReqStorage =ReadDB2("ChrCustomizationReq.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ);
+ ChrCustomizationReqChoiceStorage =ReadDB2("ChrCustomizationReqChoice.db2", HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ_CHOICE);
+ ChrModelStorage =ReadDB2("ChrModel.db2", HotfixStatements.SEL_CHR_MODEL);
+ ChrRaceXChrModelStorage =ReadDB2("ChrRaceXChrModel.db2", HotfixStatements.SEL_CHR_RACE_X_CHR_MODEL);
ChrRacesStorage = ReadDB2("ChrRaces.db2", HotfixStatements.SEL_CHR_RACES, HotfixStatements.SEL_CHR_RACES_LOCALE);
ChrSpecializationStorage = ReadDB2("ChrSpecialization.db2", HotfixStatements.SEL_CHR_SPECIALIZATION, HotfixStatements.SEL_CHR_SPECIALIZATION_LOCALE);
CinematicCameraStorage = ReadDB2("CinematicCamera.db2", HotfixStatements.SEL_CINEMATIC_CAMERA);
@@ -232,7 +238,6 @@ namespace Game.DataStorage
RewardPackStorage = ReadDB2("RewardPack.db2", HotfixStatements.SEL_REWARD_PACK);
RewardPackXCurrencyTypeStorage = ReadDB2("RewardPackXCurrencyType.db2", HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE);
RewardPackXItemStorage = ReadDB2("RewardPackXItem.db2", HotfixStatements.SEL_REWARD_PACK_X_ITEM);
- ScalingStatDistributionStorage = ReadDB2("ScalingStatDistribution.db2", HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION);
ScenarioStorage = ReadDB2("Scenario.db2", HotfixStatements.SEL_SCENARIO, HotfixStatements.SEL_SCENARIO_LOCALE);
ScenarioStepStorage = ReadDB2("ScenarioStep.db2", HotfixStatements.SEL_SCENARIO_STEP, HotfixStatements.SEL_SCENARIO_STEP_LOCALE);
//SceneScriptStorage = ReadDB2("SceneScript.db2", HotfixStatements.SEL_SCENE_SCRIPT);
@@ -287,6 +292,7 @@ namespace Game.DataStorage
TotemCategoryStorage = ReadDB2("TotemCategory.db2", HotfixStatements.SEL_TOTEM_CATEGORY, HotfixStatements.SEL_TOTEM_CATEGORY_LOCALE);
ToyStorage = ReadDB2("Toy.db2", HotfixStatements.SEL_TOY, HotfixStatements.SEL_TOY_LOCALE);
TransmogHolidayStorage = ReadDB2("TransmogHoliday.db2", HotfixStatements.SEL_TRANSMOG_HOLIDAY);
+ TransmogIllusionStorage = ReadDB2("TransmogIllusion.db2", HotfixStatements.SEL_TRANSMOG_ILLUSION);
TransmogSetStorage = ReadDB2("TransmogSet.db2", HotfixStatements.SEL_TRANSMOG_SET, HotfixStatements.SEL_TRANSMOG_SET_LOCALE);
TransmogSetGroupStorage = ReadDB2("TransmogSetGroup.db2", HotfixStatements.SEL_TRANSMOG_SET_GROUP, HotfixStatements.SEL_TRANSMOG_SET_GROUP_LOCALE);
TransmogSetItemStorage = ReadDB2("TransmogSetItem.db2", HotfixStatements.SEL_TRANSMOG_SET_ITEM);
@@ -440,14 +446,20 @@ namespace Game.DataStorage
public static DB6Storage BattlemasterListStorage;
public static DB6Storage BroadcastTextStorage;
public static DB6Storage CfgRegionsStorage;
- public static DB6Storage CharacterFacialHairStylesStorage;
- public static DB6Storage CharBaseSectionStorage;
- public static DB6Storage CharSectionsStorage;
- public static DB6Storage CharStartOutfitStorage;
public static DB6Storage CharTitlesStorage;
+ public static DB6Storage CharacterLoadoutStorage;
+ public static DB6Storage CharacterLoadoutItemStorage;
public static DB6Storage ChatChannelsStorage;
public static DB6Storage ChrClassesStorage;
public static DB6Storage ChrClassesXPowerTypesStorage;
+ public static DB6Storage ChrCustomizationChoiceStorage;
+ public static DB6Storage ChrCustomizationDisplayInfoStorage;
+ public static DB6Storage ChrCustomizationElementStorage;
+ public static DB6Storage ChrCustomizationReqStorage;
+ public static DB6Storage ChrCustomizationReqChoiceStorage;
+ public static DB6Storage ChrModelStorage;
+ public static DB6Storage ChrRaceXChrModelStorage;
+ public static DB6Storage ChrCustomizationOptionStorage;
public static DB6Storage ChrRacesStorage;
public static DB6Storage ChrSpecializationStorage;
public static DB6Storage CinematicCameraStorage;
@@ -581,7 +593,6 @@ namespace Game.DataStorage
public static DB6Storage RewardPackStorage;
public static DB6Storage RewardPackXCurrencyTypeStorage;
public static DB6Storage RewardPackXItemStorage;
- public static DB6Storage ScalingStatDistributionStorage;
public static DB6Storage ScenarioStorage;
public static DB6Storage ScenarioStepStorage;
//public static DB6Storage SceneScriptStorage;
@@ -636,6 +647,7 @@ namespace Game.DataStorage
public static DB6Storage TotemCategoryStorage;
public static DB6Storage ToyStorage;
public static DB6Storage TransmogHolidayStorage;
+ public static DB6Storage TransmogIllusionStorage;
public static DB6Storage TransmogSetStorage;
public static DB6Storage TransmogSetGroupStorage;
public static DB6Storage TransmogSetItemStorage;
diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs
index 2055b755c..40a1dcdf2 100644
--- a/Source/Game/DataStorage/DB2Manager.cs
+++ b/Source/Game/DataStorage/DB2Manager.cs
@@ -23,6 +23,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
+using Framework.Dynamic;
namespace Game.DataStorage
{
@@ -123,41 +124,6 @@ namespace Game.DataStorage
}
}
- foreach (CharacterFacialHairStylesRecord characterFacialStyle in CliDB.CharacterFacialHairStylesStorage.Values)
- _characterFacialHairStyles.Add(Tuple.Create(characterFacialStyle.RaceID, characterFacialStyle.SexID, (uint)characterFacialStyle.VariationID));
-
- CliDB.CharacterFacialHairStylesStorage.Clear();
-
- CharBaseSectionVariation[] sectionToBase = new CharBaseSectionVariation[(int)CharSectionType.Max];
- foreach (CharBaseSectionRecord charBaseSection in CliDB.CharBaseSectionStorage.Values)
- {
- Cypher.Assert(charBaseSection.ResolutionVariationEnum < (byte)CharSectionType.Max, $"SECTION_TYPE_MAX ({(byte)CharSectionType.Max}) must be equal to or greater than {charBaseSection.ResolutionVariationEnum + 1}");
- Cypher.Assert(charBaseSection.VariationEnum < CharBaseSectionVariation.Max, $"CharBaseSectionVariation.Max {(byte)CharBaseSectionVariation.Max} must be equal to or greater than {charBaseSection.VariationEnum + 1}");
-
- sectionToBase[charBaseSection.ResolutionVariationEnum] = charBaseSection.VariationEnum;
- }
-
- CliDB.CharBaseSectionStorage.Clear();
-
- MultiMap, Tuple> addedSections = new MultiMap, Tuple>();
- foreach (CharSectionsRecord charSection in CliDB.CharSectionsStorage.Values)
- {
- Cypher.Assert(charSection.BaseSection < (byte)CharSectionType.Max, $"SECTION_TYPE_MAX ({(byte)CharSectionType.Max}) must be equal to or greater than {charSection.BaseSection + 1}");
-
- Tuple sectionKey = Tuple.Create(charSection.RaceID, charSection.SexID, sectionToBase[charSection.BaseSection]);
- Tuple sectionCombination = Tuple.Create(charSection.VariationIndex, charSection.ColorIndex);
- if (addedSections.Contains(sectionKey, sectionCombination))
- continue;
-
- addedSections.Add(sectionKey, sectionCombination);
- _charSections.Add(sectionKey, charSection);
- }
-
- CliDB.CharSectionsStorage.Clear();
-
- foreach (var outfit in CliDB.CharStartOutfitStorage.Values)
- _charStartOutfits[(uint)((byte)outfit.RaceID | (outfit.ClassID << 8) | (outfit.SexID << 16))] = outfit;
-
var powers = new List();
foreach (var chrClasses in CliDB.ChrClassesXPowerTypesStorage.Values)
powers.Add(chrClasses);
@@ -175,6 +141,71 @@ namespace Game.DataStorage
_powersByClass[power.ClassID][power.PowerType] = index;
}
+ foreach (var customizationChoice in CliDB.ChrCustomizationChoiceStorage.Values)
+ _chrCustomizationChoicesByOption.Add(customizationChoice.ChrCustomizationOptionID, customizationChoice);
+
+ MultiMap> shapeshiftFormByModel = new MultiMap>();
+ Dictionary displayInfoByCustomizationChoice = new Dictionary();
+
+ // build shapeshift form model lookup
+ foreach (ChrCustomizationElementRecord customizationElement in CliDB.ChrCustomizationElementStorage.Values)
+ {
+ ChrCustomizationDisplayInfoRecord customizationDisplayInfo = CliDB.ChrCustomizationDisplayInfoStorage.LookupByKey(customizationElement.ChrCustomizationDisplayInfoID);
+ if (customizationDisplayInfo != null)
+ {
+ ChrCustomizationChoiceRecord customizationChoice = CliDB.ChrCustomizationChoiceStorage.LookupByKey(customizationElement.ChrCustomizationChoiceID);
+ if (customizationChoice != null)
+ {
+ displayInfoByCustomizationChoice[customizationElement.ChrCustomizationChoiceID] = customizationDisplayInfo;
+ ChrCustomizationOptionRecord customizationOption = CliDB.ChrCustomizationOptionStorage.LookupByKey(customizationChoice.ChrCustomizationOptionID);
+ if (customizationOption != null)
+ shapeshiftFormByModel.Add(customizationOption.ChrModelID, Tuple.Create(customizationOption.Id, (byte)customizationDisplayInfo.ShapeshiftFormID));
+ }
+ }
+ }
+
+ MultiMap customizationOptionsByModel = new MultiMap();
+ foreach (ChrCustomizationOptionRecord customizationOption in CliDB.ChrCustomizationOptionStorage.Values)
+ customizationOptionsByModel.Add(customizationOption.ChrModelID, customizationOption);
+
+ foreach (ChrCustomizationReqChoiceRecord reqChoice in CliDB.ChrCustomizationReqChoiceStorage.Values)
+ {
+ ChrCustomizationChoiceRecord customizationChoice = CliDB.ChrCustomizationChoiceStorage.LookupByKey(reqChoice.ChrCustomizationChoiceID);
+ if (customizationChoice != null)
+ {
+ if (!_chrCustomizationRequiredChoices.ContainsKey(reqChoice.ChrCustomizationReqID))
+ _chrCustomizationRequiredChoices[reqChoice.ChrCustomizationReqID] = new MultiMap();
+
+ _chrCustomizationRequiredChoices[reqChoice.ChrCustomizationReqID].Add(customizationChoice.ChrCustomizationOptionID, reqChoice.ChrCustomizationChoiceID);
+ }
+ }
+
+ foreach (ChrRaceXChrModelRecord raceModel in CliDB.ChrRaceXChrModelStorage.Values)
+ {
+ ChrModelRecord model = CliDB.ChrModelStorage.LookupByKey(raceModel.ChrModelID);
+ if (model != null)
+ {
+ _chrModelsByRaceAndGender[Tuple.Create((byte)raceModel.ChrRacesID, (byte)model.Sex)] = model;
+
+ var customizationOptionsForModel = customizationOptionsByModel.LookupByKey(model.Id);
+ if (customizationOptionsForModel != null)
+ _chrCustomizationOptionsByRaceAndGender.AddRange(Tuple.Create((byte)raceModel.ChrRacesID, (byte)model.Sex), customizationOptionsForModel);
+
+ // link shapeshift displays to race/gender/form
+ foreach (var shapeshiftOptionsForModel in shapeshiftFormByModel.LookupByKey(model.Id))
+ {
+ ShapeshiftFormModelData data = _chrCustomizationChoicesForShapeshifts[Tuple.Create((byte)raceModel.ChrRacesID, (byte)model.Sex, shapeshiftOptionsForModel.Item2)];
+ data.OptionID = shapeshiftOptionsForModel.Item2;
+ data.Choices = _chrCustomizationChoicesByOption.LookupByKey(shapeshiftOptionsForModel.Item2);
+ if (!data.Choices.Empty())
+ {
+ for (int i = 0; i < data.Choices.Count; ++i)
+ data.Displays[i] = displayInfoByCustomizationChoice.LookupByKey(data.Choices[i].Id);
+ }
+ }
+ }
+ }
+
foreach (ChrSpecializationRecord chrSpec in CliDB.ChrSpecializationStorage.Values)
{
//ASSERT(chrSpec.ClassID < MAX_CLASSES);
@@ -190,9 +221,6 @@ namespace Game.DataStorage
_chrSpecializationsByIndex[storageIndex] = new ChrSpecializationRecord[PlayerConst.MaxSpecializations];
_chrSpecializationsByIndex[storageIndex][chrSpec.OrderIndex] = chrSpec;
-
- if (chrSpec.Flags.HasAnyFlag(ChrSpecializationFlag.Recommended))
- _defaultChrSpecializationsByClass[(uint)chrSpec.ClassID] = chrSpec;
}
foreach (ContentTuningXExpectedRecord contentTuningXExpectedStat in CliDB.ContentTuningXExpectedStorage.Values)
@@ -557,7 +585,7 @@ namespace Game.DataStorage
UiMapRecord parentUiMap = CliDB.UiMapStorage.LookupByKey(uiMap.ParentUiMapID);
if (parentUiMap != null)
{
- if (Convert.ToBoolean(parentUiMap.Flags & 0x80))
+ if (parentUiMap.GetFlags().HasAnyFlag(UiMapFlag.NoWorldPositions))
continue;
UiMapAssignmentRecord uiMapAssignment = null;
UiMapAssignmentRecord parentUiMapAssignment = null;
@@ -744,9 +772,7 @@ namespace Game.DataStorage
public uint GetEmptyAnimStateID()
{
- return 1484;
- // TEMP: well... AnimationData.db2 in 8.3.0 has more rows than max hardcoded anim id in client
- // return sAnimationDataStore.GetNumRows();
+ return (uint)CliDB.AnimationDataStorage.Count;
}
public List GetAreasForGroup(uint areaGroupId)
@@ -855,31 +881,6 @@ namespace Game.DataStorage
return broadcastText.Text[SharedConst.DefaultLocale];
}
- public bool HasCharacterFacialHairStyle(Race race, Gender gender, uint variationId)
- {
- return _characterFacialHairStyles.Contains(Tuple.Create((byte)race, (byte)gender, variationId));
- }
-
- public bool HasCharSections(Race race, Gender gender, CharBaseSectionVariation variation)
- {
- return _charSections.ContainsKey(Tuple.Create((byte)race, (byte)gender, variation));
- }
-
- public CharSectionsRecord GetCharSectionEntry(Race race, Gender gender, CharBaseSectionVariation variation, byte variationIndex, byte colorIndex)
- {
- var list = _charSections.LookupByKey(Tuple.Create((byte)race, (byte)gender, variation));
- foreach (var charSection in list)
- if (charSection.VariationIndex == variationIndex && charSection.ColorIndex == colorIndex)
- return charSection;
-
- return null;
- }
-
- public CharStartOutfitRecord GetCharStartOutfitEntry(uint race, uint class_, uint gender)
- {
- return _charStartOutfits.LookupByKey(race | (class_ << 8) | (gender << 16));
- }
-
public string GetClassName(Class class_, Locale locale = Locale.enUS)
{
ChrClassesRecord classEntry = CliDB.ChrClassesStorage.LookupByKey(class_);
@@ -897,6 +898,26 @@ namespace Game.DataStorage
return _powersByClass[(int)classId][(int)powerType];
}
+ public List GetCustomiztionChoices(uint chrCustomizationOptionId)
+ {
+ return _chrCustomizationChoicesByOption.LookupByKey(chrCustomizationOptionId);
+ }
+
+ public List GetCustomiztionOptions(Race race, Gender gender)
+ {
+ return _chrCustomizationOptionsByRaceAndGender.LookupByKey(Tuple.Create(race, gender));
+ }
+
+ public MultiMap GetRequiredCustomizationChoices(uint chrCustomizationReqId)
+ {
+ return _chrCustomizationRequiredChoices.LookupByKey(chrCustomizationReqId);
+ }
+
+ public ChrModelRecord GetChrModel(Race race, Gender gender)
+ {
+ return _chrModelsByRaceAndGender.LookupByKey(Tuple.Create(race, gender));
+ }
+
public string GetChrRaceName(Race race, Locale locale = Locale.enUS)
{
ChrRacesRecord raceEntry = CliDB.ChrRacesStorage.LookupByKey(race);
@@ -916,7 +937,46 @@ namespace Game.DataStorage
public ChrSpecializationRecord GetDefaultChrSpecializationForClass(Class class_)
{
- return _defaultChrSpecializationsByClass.LookupByKey(class_);
+ return GetChrSpecializationByIndex(class_, PlayerConst.InitialSpecializationIndex);
+ }
+
+ public ContentTuningLevels? GetContentTuningData(uint contentTuningId, uint replacementConditionMask, bool forItem = false)
+ {
+ ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(contentTuningId);
+ if (contentTuning == null)
+ return null;
+
+ if (forItem && contentTuning.GetFlags().HasFlag(ContentTuningFlag.DisabledForItem))
+ return null;
+
+ int getLevelAdjustment(ContentTuningCalcType type) => type switch
+ {
+ ContentTuningCalcType.PlusOne => 1,
+ ContentTuningCalcType.PlusMaxLevelForExpansion => (int)Global.ObjectMgr.GetMaxLevelForExpansion((Expansion)WorldConfig.GetUIntValue(WorldCfg.Expansion)),
+ _ => 0
+ };
+
+ ContentTuningLevels levels = new ContentTuningLevels();
+ levels.MinLevel = (short)(contentTuning.MinLevel + getLevelAdjustment((ContentTuningCalcType)contentTuning.MinLevelType));
+ levels.MaxLevel = (short)(contentTuning.MaxLevel + getLevelAdjustment((ContentTuningCalcType)contentTuning.MaxLevelType));
+ levels.MinLevelWithDelta = (short)Math.Clamp(levels.MinLevel + contentTuning.TargetLevelDelta, 1, SharedConst.MaxLevel);
+ levels.MaxLevelWithDelta = (short)Math.Clamp(levels.MaxLevel + contentTuning.TargetLevelMaxDelta, 1, SharedConst.MaxLevel);
+
+ // clamp after calculating levels with delta (delta can bring "overflown" level back into correct range)
+ levels.MinLevel = (short)Math.Clamp((int)levels.MinLevel, 1, SharedConst.MaxLevel);
+ levels.MaxLevel = (short)Math.Clamp((int)levels.MaxLevel, 1, SharedConst.MaxLevel);
+
+ if (contentTuning.TargetLevelMin != 0)
+ levels.TargetLevelMin = (short)contentTuning.TargetLevelMin;
+ else
+ levels.TargetLevelMin = levels.MinLevelWithDelta;
+
+ if (contentTuning.TargetLevelMax != 0)
+ levels.TargetLevelMax = (short)contentTuning.TargetLevelMax;
+ else
+ levels.TargetLevelMax = levels.MaxLevelWithDelta;
+
+ return levels;
}
public string GetCreatureFamilyPetName(CreatureFamily petfamily, Locale locale)
@@ -1708,6 +1768,11 @@ namespace Game.DataStorage
return _rewardPackItems.LookupByKey(rewardPackID);
}
+ public ShapeshiftFormModelData GetShapeshiftFormModelData(Race race, Gender gender, ShapeShiftForm form)
+ {
+ return _chrCustomizationChoicesForShapeshifts.LookupByKey(Tuple.Create((byte)race, (byte)gender, (byte)form));
+ }
+
public List GetSkillLinesForParentSkill(uint parentSkillId)
{
return _skillLinesByParentSkillLine.LookupByKey(parentSkillId);
@@ -2091,12 +2156,13 @@ namespace Game.DataStorage
MultiMap _azeritePowers = new MultiMap();
Dictionary<(uint azeriteUnlockSetId, ItemContext itemContext), byte[]> _azeriteTierUnlockLevels = new Dictionary<(uint azeriteUnlockSetId, ItemContext itemContext), byte[]>();
Dictionary<(uint itemId, ItemContext itemContext), AzeriteUnlockMappingRecord> _azeriteUnlockMappings = new Dictionary<(uint itemId, ItemContext itemContext), AzeriteUnlockMappingRecord>();
- List> _characterFacialHairStyles = new List>();
- MultiMap, CharSectionsRecord> _charSections = new MultiMap, CharSectionsRecord>();
- Dictionary _charStartOutfits = new Dictionary();
uint[][] _powersByClass = new uint[(int)Class.Max][];
+ MultiMap _chrCustomizationChoicesByOption = new MultiMap();
+ Dictionary, ChrModelRecord> _chrModelsByRaceAndGender = new Dictionary, ChrModelRecord>();
+ Dictionary, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts = new Dictionary, ShapeshiftFormModelData>();
+ MultiMap, ChrCustomizationOptionRecord> _chrCustomizationOptionsByRaceAndGender = new MultiMap, ChrCustomizationOptionRecord>();
+ Dictionary> _chrCustomizationRequiredChoices = new Dictionary>();
ChrSpecializationRecord[][] _chrSpecializationsByIndex = new ChrSpecializationRecord[(int)Class.Max + 1][];
- Dictionary _defaultChrSpecializationsByClass = new Dictionary();
MultiMap _curvePoints = new MultiMap();
Dictionary, EmotesTextSoundRecord> _emoteTextSounds = new Dictionary, EmotesTextSoundRecord>();
Dictionary, ExpectedStatRecord> _expectedStatsByLevel = new Dictionary, ExpectedStatRecord>();
@@ -2363,6 +2429,23 @@ namespace Game.DataStorage
}
}
+ public struct ContentTuningLevels
+ {
+ public short MinLevel;
+ public short MaxLevel;
+ public short MinLevelWithDelta;
+ public short MaxLevelWithDelta;
+ public short TargetLevelMin;
+ public short TargetLevelMax;
+ }
+
+ public class ShapeshiftFormModelData
+ {
+ public uint OptionID;
+ public List Choices = new List();
+ public List Displays = new List();
+ }
+
enum CurveInterpolationMode
{
Linear = 0,
diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs
index a3e6d17c6..97711571f 100644
--- a/Source/Game/DataStorage/Structs/A_Records.cs
+++ b/Source/Game/DataStorage/Structs/A_Records.cs
@@ -39,6 +39,7 @@ namespace Game.DataStorage
public int RewardItemID;
public uint CriteriaTree;
public ushort SharesCriteria;
+ public int CovenantID;
}
public sealed class AnimationDataRecord
@@ -79,7 +80,6 @@ namespace Game.DataStorage
public ushort UwAmbience;
public ushort ZoneMusic;
public ushort UwZoneMusic;
- public sbyte ExplorationLevel;
public ushort IntroSound;
public uint UwIntroSound;
public byte FactionGroupMask;
@@ -89,6 +89,7 @@ namespace Game.DataStorage
public byte WildBattlePetLevelMin;
public byte WildBattlePetLevelMax;
public byte WindSettingsID;
+ public uint ContentTuningID;
public AreaFlags[] Flags = new AreaFlags[2];
public ushort[] LiquidTypeID = new ushort[4];
diff --git a/Source/Game/DataStorage/Structs/B_Records.cs b/Source/Game/DataStorage/Structs/B_Records.cs
index d8e42d043..c9dffff8e 100644
--- a/Source/Game/DataStorage/Structs/B_Records.cs
+++ b/Source/Game/DataStorage/Structs/B_Records.cs
@@ -54,7 +54,7 @@ namespace Game.DataStorage
public sealed class BattlePetBreedStateRecord
{
public uint Id;
- public byte BattlePetStateID;
+ public int BattlePetStateID;
public ushort Value;
public uint BattlePetBreedID;
}
@@ -72,6 +72,7 @@ namespace Game.DataStorage
public sbyte SourceTypeEnum;
public int CardUIModelSceneID;
public int LoadoutUIModelSceneID;
+ public int CovenantID;
}
public sealed class BattlePetSpeciesStateRecord
@@ -100,7 +101,7 @@ namespace Game.DataStorage
public ushort HolidayWorldState;
public BattlemasterListFlags Flags;
public int IconFileDataID;
- public short RequiredPlayerConditionID;
+ public int RequiredPlayerConditionID;
public short[] MapId = new short[16];
}
@@ -109,7 +110,7 @@ namespace Game.DataStorage
public LocalizedString Text;
public LocalizedString Text1;
public uint Id;
- public byte LanguageID;
+ public int LanguageID;
public int ConditionID;
public ushort EmotesID;
public byte Flags;
diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs
index 61f0b58ae..7367f2fa7 100644
--- a/Source/Game/DataStorage/Structs/C_Records.cs
+++ b/Source/Game/DataStorage/Structs/C_Records.cs
@@ -30,47 +30,6 @@ namespace Game.DataStorage
public uint ChallengeOrigin;
}
- public sealed class CharacterFacialHairStylesRecord
- {
- public uint Id;
- public int[] Geoset = new int[5];
- public byte RaceID;
- public byte SexID;
- public byte VariationID;
- }
-
- public sealed class CharBaseSectionRecord
- {
- public uint Id;
- public byte LayoutResType;
- public CharBaseSectionVariation VariationEnum;
- public byte ResolutionVariationEnum;
- }
-
- public sealed class CharSectionsRecord
- {
- public uint Id;
- public byte RaceID;
- public byte SexID;
- public sbyte BaseSection;
- public byte VariationIndex;
- public byte ColorIndex;
- public short Flags;
- public int[] MaterialResourcesID = new int[3];
- }
-
- public sealed class CharStartOutfitRecord
- {
- public uint Id;
- public byte ClassID;
- public byte SexID;
- public byte OutfitID;
- public uint PetDisplayID; // Pet Model ID for starting pet
- public byte PetFamilyID; // Pet Family Entry for starting pet
- public int[] ItemID = new int[24];
- public uint RaceID;
- }
-
public sealed class CharTitlesRecord
{
public uint Id;
@@ -80,13 +39,31 @@ namespace Game.DataStorage
public sbyte Flags;
}
- public sealed class ChatChannelsRecord
+ public sealed class CharacterLoadoutRecord
+ {
+ public long RaceMask;
+ public uint Id;
+ public sbyte ChrClassID;
+ public sbyte Purpose;
+
+ public bool IsForNewCharacter() { return Purpose == 9; }
+ }
+
+ public sealed class CharacterLoadoutItemRecord
{
public uint Id;
+ public ushort CharacterLoadoutID;
+ public uint ItemID;
+ }
+
+ public sealed class ChatChannelsRecord
+ {
public LocalizedString Name;
- public string Shortcut;
+ public string Shortcut;
+ public uint Id;
public ChannelDBCFlags Flags;
public sbyte FactionGroup;
+ public int Ruleset;
}
public sealed class ChrClassesRecord
@@ -96,14 +73,29 @@ namespace Game.DataStorage
public string NameMale;
public string NameFemale;
public string PetNameToken;
+ public string Description;
+ public string RoleInfoString;
+ public string DisabledString;
+ public string HyphenatedNameMale;
+ public string HyphenatedNameFemale;
public uint Id;
public uint CreateScreenFileDataID;
public uint SelectScreenFileDataID;
public uint IconFileDataID;
public uint LowResScreenFileDataID;
- public int StartingLevel;
+ public uint Flags;
public uint SpellTextureBlobFileDataID;
- public ushort Flags;
+ public uint RolesMask;
+ public uint ArmorTypeMask;
+ public int CharStartKitUnknown901;
+ public int MaleCharacterCreationVisualFallback;
+ public int MaleCharacterCreationIdleVisualFallback;
+ public int FemaleCharacterCreationVisualFallback;
+ public int FemaleCharacterCreationIdleVisualFallback;
+ public int CharacterCreationIdleGroundVisualFallback;
+ public int CharacterCreationGroundVisualFallback;
+ public int AlteredFormCharacterCreationIdleVisualFallback;
+ public int CharacterCreationAnimLoopWaitTimeMsFallback;
public ushort CinematicSequenceID;
public ushort DefaultSpec;
public byte PrimaryStatPriority;
@@ -112,6 +104,9 @@ namespace Game.DataStorage
public byte AttackPowerPerAgility;
public byte AttackPowerPerStrength;
public byte SpellClassSet;
+ public byte ChatColorR;
+ public byte ChatColorG;
+ public byte ChatColorB;
}
public sealed class ChrClassesXPowerTypesRecord
@@ -121,6 +116,103 @@ namespace Game.DataStorage
public uint ClassID;
}
+ public sealed class ChrCustomizationChoiceRecord
+ {
+ public LocalizedString Name;
+ public uint Id;
+ public uint ChrCustomizationOptionID;
+ public uint ChrCustomizationReqID;
+ public ushort SortOrder;
+ public int SwatchColor1;
+ public int SwatchColor2;
+ public ushort UiOrderIndex;
+ public int Flags;
+ }
+
+ public sealed class ChrCustomizationDisplayInfoRecord
+ {
+ public uint Id;
+ public int ShapeshiftFormID;
+ public uint DisplayID;
+ public float BarberShopMinCameraDistance;
+ public float BarberShopHeightOffset;
+ }
+
+ public sealed class ChrCustomizationElementRecord
+ {
+ public uint Id;
+ public uint ChrCustomizationChoiceID;
+ public int RelatedChrCustomizationChoiceID;
+ public int ChrCustomizationGeosetID;
+ public int ChrCustomizationSkinnedModelID;
+ public int ChrCustomizationMaterialID;
+ public int ChrCustomizationBoneSetID;
+ public int ChrCustomizationCondModelID;
+ public int ChrCustomizationDisplayInfoID;
+ }
+
+ public sealed class ChrCustomizationOptionRecord
+ {
+ public LocalizedString Name;
+ public uint Id;
+ public ushort SecondaryID;
+ public int Flags;
+ public uint ChrModelID;
+ public int SortIndex;
+ public int ChrCustomizationCategoryID;
+ public int OptionType;
+ public float BarberShopCostModifier;
+ public int ChrCustomizationID;
+ public int ChrCustomizationReqID;
+ public int UiOrderIndex;
+ }
+
+ public sealed class ChrCustomizationReqRecord
+ {
+ public uint Id;
+ public int Flags;
+ public int ClassMask;
+ public int AchievementID;
+ public int OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar
+ public uint ItemModifiedAppearanceID;
+
+ public ChrCustomizationReqFlag GetFlags() { return (ChrCustomizationReqFlag)Flags; }
+ }
+
+ public sealed class ChrCustomizationReqChoiceRecord
+ {
+ public uint Id;
+ public uint ChrCustomizationChoiceID;
+ public uint ChrCustomizationReqID;
+ }
+
+ public sealed class ChrModelRecord
+ {
+ public float[] FaceCustomizationOffset = new float[3];
+ public float[] CustomizeOffset = new float[3];
+ public uint Id;
+ public int Sex;
+ public uint DisplayID;
+ public int CharComponentTextureLayoutID;
+ public int Flags;
+ public int SkeletonFileDataID;
+ public int ModelFallbackChrModelID;
+ public int TextureFallbackChrModelID;
+ public int HelmVisFallbackChrModelID;
+ public float CustomizeScale;
+ public float CustomizeFacing;
+ public float CameraDistanceOffset;
+ public float BarberShopCameraOffsetScale;
+ public float BarberShopCameraRotationOffset;
+ }
+
+ public sealed class ChrRaceXChrModelRecord
+ {
+ public uint Id;
+ public int ChrRacesID;
+ public int ChrModelID;
+ }
+
public sealed class ChrRacesRecord
{
public string ClientPrefix;
@@ -129,37 +221,39 @@ namespace Game.DataStorage
public string NameFemale;
public string NameLowercase;
public string NameFemaleLowercase;
+ public string NameS;
+ public string NameFemaleS;
+ public string NameLowercaseS;
+ public string NameFemaleLowercaseS;
+ public string RaceFantasyDescription;
+ public string NameL;
+ public string NameFemaleL;
+ public string NameLowercaseL;
+ public string NameFemaleLowercaseL;
public uint Id;
public int Flags;
- public uint MaleDisplayId;
- public uint FemaleDisplayId;
- public uint HighResMaleDisplayId;
- public uint HighResFemaleDisplayId;
+ public int BaseLanguage;
+ public int ResSicknessSpellID;
+ public int SplashSoundID;
public int CreateScreenFileDataID;
public int SelectScreenFileDataID;
- public float[] MaleCustomizeOffset = new float[3];
- public float[] FemaleCustomizeOffset = new float[3];
public int LowResScreenFileDataID;
public uint[] AlteredFormStartVisualKitID = new uint[3];
public uint[] AlteredFormFinishVisualKitID = new uint[3];
public int HeritageArmorAchievementID;
public int StartingLevel;
public int UiDisplayOrder;
- public int FemaleSkeletonFileDataID;
- public int MaleSkeletonFileDataID;
- public int HelmVisFallbackRaceID;
+ public int PlayableRaceBit;
+ public int HelmetAnimScalingRaceID;
public int TransmogrifyDisabledSlotMask;
+ public float[] AlteredFormCustomizeOffsetFallback = new float[3];
+ public float AlteredFormCustomizeRotationFallback;
public ushort FactionID;
public ushort CinematicSequenceID;
- public short ResSicknessSpellID;
- public short SplashSoundID;
- public sbyte BaseLanguage;
public sbyte CreatureType;
public sbyte Alliance;
public sbyte RaceRelated;
public sbyte UnalteredVisualRaceID;
- public sbyte CharComponentTextureLayoutID;
- public sbyte CharComponentTexLayoutHiResID;
public sbyte DefaultClassID;
public sbyte NeutralRaceID;
public sbyte MaleModelFallbackRaceID;
@@ -170,6 +264,7 @@ namespace Game.DataStorage
public sbyte MaleTextureFallbackSex;
public sbyte FemaleTextureFallbackRaceID;
public sbyte FemaleTextureFallbackSex;
+ public sbyte UnalteredVisualCustomizationRaceID;
}
public sealed class ChrSpecializationRecord
@@ -213,10 +308,31 @@ namespace Game.DataStorage
public sealed class ContentTuningRecord
{
public uint Id;
- public int MinLevel;
- public int MaxLevel;
public int Flags;
public int ExpansionID;
+ public int MinLevel;
+ public int MaxLevel;
+ public int MinLevelType;
+ public int MaxLevelType;
+ public int TargetLevelDelta;
+ public int TargetLevelMaxDelta;
+ public int TargetLevelMin;
+ public int TargetLevelMax;
+ public int MinItemLevel;
+
+ public ContentTuningFlag GetFlags() { return (ContentTuningFlag)Flags; }
+
+ public int GetScalingFactionGroup()
+ {
+ ContentTuningFlag flags = GetFlags();
+ if (flags.HasFlag(ContentTuningFlag.Horde))
+ return 5;
+
+ if (flags.HasFlag(ContentTuningFlag.Alliance))
+ return 3;
+
+ return 0;
+ }
}
public sealed class ContentTuningXExpectedRecord
@@ -284,15 +400,9 @@ namespace Game.DataStorage
public sbyte DisplayRaceID;
public sbyte DisplaySexID;
public sbyte DisplayClassID;
- public sbyte SkinID;
- public sbyte FaceID;
- public sbyte HairStyleID;
- public sbyte HairColorID;
- public sbyte FacialHairID;
public sbyte Flags;
public int BakeMaterialResourcesID;
public int HDBakeMaterialResourcesID;
- public byte[] CustomDisplayOption = new byte[3];
}
public sealed class CreatureFamilyRecord
@@ -385,18 +495,19 @@ namespace Game.DataStorage
public uint Id;
public string Name;
public string Description;
- public byte CategoryID;
+ public int CategoryID;
public int InventoryIconFileID;
public uint SpellWeight;
public byte SpellCategory;
public uint MaxQty;
public uint MaxEarnablePerWeek;
- public uint Flags;
public sbyte Quality;
public int FactionID;
public int ItemGroupSoundsID;
- public int ConvertToPlayerExperience;
- public int PlayerConditionID;
+ public int XpQuestDifficulty;
+ public int AwardConditionID;
+ public int MaxQtyWorldStateID;
+ public int[] Flags = new int[2];
}
public sealed class CurveRecord
@@ -410,6 +521,7 @@ namespace Game.DataStorage
{
public uint Id;
public Vector2 Pos;
+ public Vector2 PosPreSquish;
public ushort CurveID;
public byte OrderIndex;
}
diff --git a/Source/Game/DataStorage/Structs/D_Records.cs b/Source/Game/DataStorage/Structs/D_Records.cs
index 936bfe33d..8a4b3ec67 100644
--- a/Source/Game/DataStorage/Structs/D_Records.cs
+++ b/Source/Game/DataStorage/Structs/D_Records.cs
@@ -24,20 +24,20 @@ namespace Game.DataStorage
public uint Id;
public sbyte State0ImpactEffectDoodadSet;
public byte State0AmbientDoodadSet;
- public ushort State1Wmo;
+ public uint State1Wmo;
public sbyte State1DestructionDoodadSet;
public sbyte State1ImpactEffectDoodadSet;
public byte State1AmbientDoodadSet;
- public ushort State2Wmo;
+ public uint State2Wmo;
public sbyte State2DestructionDoodadSet;
public sbyte State2ImpactEffectDoodadSet;
public byte State2AmbientDoodadSet;
- public ushort State3Wmo;
+ public uint State3Wmo;
public byte State3InitDoodadSet;
public byte State3AmbientDoodadSet;
public byte EjectDirection;
public byte DoNotHighlight;
- public ushort State0Wmo;
+ public uint State0Wmo;
public byte HealEffect;
public ushort HealEffectSpeed;
public byte State0NameSet;
@@ -69,7 +69,7 @@ namespace Game.DataStorage
public LocalizedString Name;
public uint Id;
public short MapID;
- public sbyte DifficultyID;
+ public int DifficultyID;
public int OrderIndex;
public int CompleteWorldStateID;
public sbyte Bit;
diff --git a/Source/Game/DataStorage/Structs/G_Records.cs b/Source/Game/DataStorage/Structs/G_Records.cs
index edb917716..158ca2d14 100644
--- a/Source/Game/DataStorage/Structs/G_Records.cs
+++ b/Source/Game/DataStorage/Structs/G_Records.cs
@@ -47,13 +47,13 @@ namespace Game.DataStorage
public Vector3 Pos;
public float[] Rot = new float[4];
public uint Id;
- public ushort OwnerID;
- public ushort DisplayID;
+ public uint OwnerID;
+ public uint DisplayID;
public float Scale;
public GameObjectTypes TypeID;
- public byte PhaseUseFlags;
- public ushort PhaseID;
- public ushort PhaseGroupID;
+ public int PhaseUseFlags;
+ public int PhaseID;
+ public int PhaseGroupID;
public int[] PropValue = new int[8];
}
@@ -80,7 +80,7 @@ namespace Game.DataStorage
public byte BuildingType;
public uint HordeGameObjectID;
public uint AllianceGameObjectID;
- public byte GarrSiteID;
+ public int GarrSiteID;
public byte UpgradeLevel;
public int BuildSeconds;
public ushort CurrencyTypeID;
@@ -153,6 +153,8 @@ namespace Game.DataStorage
public byte ChrClassID;
public byte Flags;
public byte Gender;
+ public int AutoCombatantID;
+ public int CovenantID;
}
public sealed class GarrFollowerXAbilityRecord
@@ -218,7 +220,6 @@ namespace Game.DataStorage
public uint Id;
public ushort EnchantId;
public SocketColor Type;
- public ushort MinItemLevel;
}
public sealed class GlyphBindableSpellRecord
diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs
index a1e43e88e..187e5e0b4 100644
--- a/Source/Game/DataStorage/Structs/I_Records.cs
+++ b/Source/Game/DataStorage/Structs/I_Records.cs
@@ -57,6 +57,7 @@ namespace Game.DataStorage
public sbyte SoundOverrideSubclassID;
public int IconFileDataID;
public byte ItemGroupSoundsID;
+ public int ModifiedCraftingReagentItemID;
}
public sealed class ItemAppearanceRecord
@@ -66,6 +67,7 @@ namespace Game.DataStorage
public uint ItemDisplayInfoID;
public int DefaultIconFileDataID;
public int UiOrder;
+ public int PlayerConditionID;
}
public sealed class ItemArmorQualityRecord
@@ -100,7 +102,7 @@ namespace Game.DataStorage
public sealed class ItemBonusRecord
{
public uint Id;
- public int[] Value = new int[3];
+ public int[] Value = new int[4];
public ushort ParentItemBonusListID;
public ItemBonusType BonusType;
public byte OrderIndex;
@@ -109,11 +111,12 @@ namespace Game.DataStorage
public sealed class ItemBonusListGroupEntryRecord
{
public uint Id;
+ public int ItemBonusListGroupID;
public int ItemBonusListID;
public int ItemLevelSelectorID;
public int OrderIndex;
public int ItemExtendedCostID;
- public int ItemBonusListGroupID;
+ public int PlayerConditionID;
}
public sealed class ItemBonusListLevelDeltaRecord
@@ -345,6 +348,9 @@ namespace Game.DataStorage
public float PriceRandomValue;
public int[] Flags = new int[4];
public int FactionRelated;
+ public int ModifiedCraftingReagentItemID;
+ public uint ContentTuningID;
+ public uint PlayerLevelToItemLevelCurveID;
public ushort ItemNameDescriptionID;
public ushort RequiredTransmogHoliday;
public ushort RequiredHoliday;
@@ -359,7 +365,6 @@ namespace Game.DataStorage
public ushort StartQuestID;
public ushort PageID;
public ushort ItemDelay;
- public ushort ScalingStatDistributionID;
public ushort MinFactionID;
public ushort RequiredSkillRank;
public ushort RequiredSkill;
diff --git a/Source/Game/DataStorage/Structs/L_Records.cs b/Source/Game/DataStorage/Structs/L_Records.cs
index e2d3595e2..4fd4e18ac 100644
--- a/Source/Game/DataStorage/Structs/L_Records.cs
+++ b/Source/Game/DataStorage/Structs/L_Records.cs
@@ -25,8 +25,6 @@ namespace Game.DataStorage
public uint Id;
public LocalizedString Name;
public string Description;
- public byte MinLevel;
- public ushort MaxLevel;
public LfgType TypeID;
public byte Subtype;
public sbyte Faction;
@@ -40,9 +38,6 @@ namespace Game.DataStorage
public byte GroupID;
public byte OrderIndex;
public uint RequiredPlayerConditionId;
- public byte TargetLevel;
- public byte TargetLevelMin;
- public ushort TargetLevelMax;
public ushort RandomID;
public ushort ScenarioID;
public ushort FinalEncounterID;
@@ -55,6 +50,7 @@ namespace Game.DataStorage
public ushort BonusReputationAmount;
public ushort MentorItemLevel;
public byte MentorCharLevel;
+ public uint ContentTuningID;
public LfgFlags[] Flags = new LfgFlags[2];
// Helpers
@@ -100,6 +96,7 @@ namespace Game.DataStorage
public sealed class LockRecord
{
public uint Id;
+ public int Flags;
public int[] Index = new int[SharedConst.MaxLockCase];
public ushort[] Skill = new ushort[SharedConst.MaxLockCase];
public byte[] LockType = new byte[SharedConst.MaxLockCase];
diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs
index 6cb47cb17..9a441ab59 100644
--- a/Source/Game/DataStorage/Structs/M_Records.cs
+++ b/Source/Game/DataStorage/Structs/M_Records.cs
@@ -30,6 +30,7 @@ namespace Game.DataStorage
public uint Id;
public string Directory;
public LocalizedString MapName;
+ public string InternalName;
public string MapDescription0; // Horde
public string MapDescription1; // Alliance
public string PvpShortDescription;
diff --git a/Source/Game/DataStorage/Structs/P_Records.cs b/Source/Game/DataStorage/Structs/P_Records.cs
index e0102a707..e4e1c5b28 100644
--- a/Source/Game/DataStorage/Structs/P_Records.cs
+++ b/Source/Game/DataStorage/Structs/P_Records.cs
@@ -37,11 +37,9 @@ namespace Game.DataStorage
public long RaceMask;
public string FailureDescription;
public uint Id;
- public ushort MinLevel;
- public ushort MaxLevel;
public int ClassMask;
public uint SkillLogic;
- public byte LanguageID;
+ public int LanguageID;
public byte MinLanguage;
public int MaxLanguage;
public ushort MaxFactionID;
@@ -57,7 +55,7 @@ namespace Game.DataStorage
public byte ItemFlags;
public uint AuraSpellLogic;
public ushort WorldStateExpressionID;
- public byte WeatherID;
+ public int WeatherID;
public byte PartyStatus;
public byte LifetimeMaxPVPRank;
public uint AchievementLogic;
@@ -66,7 +64,7 @@ namespace Game.DataStorage
public uint AreaLogic;
public uint LfgLogic;
public uint CurrencyLogic;
- public ushort QuestKillID;
+ public uint QuestKillID;
public uint QuestKillLogic;
public sbyte MinExpansionLevel;
public sbyte MaxExpansionLevel;
@@ -77,7 +75,7 @@ namespace Game.DataStorage
public byte PhaseUseFlags;
public ushort PhaseID;
public uint PhaseGroupID;
- public byte Flags;
+ public int Flags;
public sbyte ChrSpecializationIndex;
public sbyte ChrSpecializationRole;
public uint ModifierTreeID;
@@ -91,14 +89,16 @@ namespace Game.DataStorage
public sbyte MinExpansionTier;
public byte MinPVPRank;
public byte MaxPVPRank;
+ public uint ContentTuningID;
+ public int CovenantID;
public ushort[] SkillID = new ushort[4];
public ushort[] MinSkill = new ushort[4];
public ushort[] MaxSkill = new ushort[4];
public uint[] MinFactionID = new uint[3];
public byte[] MinReputation = new byte[3];
- public ushort[] PrevQuestID = new ushort[4];
- public ushort[] CurrQuestID = new ushort[4];
- public ushort[] CurrentCompletedQuestID = new ushort[4];
+ public uint[] PrevQuestID = new uint[4];
+ public uint[] CurrQuestID = new uint[4];
+ public uint[] CurrentCompletedQuestID = new uint[4];
public uint[] SpellID = new uint[4];
public uint[] ItemID = new uint[4];
public uint[] ItemCount = new uint[4];
diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs
index 4f4879474..01efab6b9 100644
--- a/Source/Game/DataStorage/Structs/S_Records.cs
+++ b/Source/Game/DataStorage/Structs/S_Records.cs
@@ -21,14 +21,6 @@ using System;
namespace Game.DataStorage
{
- public sealed class ScalingStatDistributionRecord
- {
- public uint Id;
- public ushort PlayerLevelToItemLevelCurveID;
- public int MinLevel;
- public int MaxLevel;
- }
-
public sealed class ScenarioRecord
{
public uint Id;
@@ -46,7 +38,7 @@ namespace Game.DataStorage
public string Title;
public ushort ScenarioID;
public uint CriteriaTreeId;
- public ushort RewardQuestID;
+ public uint RewardQuestID;
public int RelatedStep; // Bonus step can only be completed if scenario is in the step specified in this field
public ushort Supersedes; // Used in conjunction with Proving Grounds scenarios, when sequencing steps (Not using step order?)
public byte OrderIndex;
@@ -117,7 +109,7 @@ namespace Game.DataStorage
public AbilityLearnType AcquireMethod;
public ushort TrivialSkillLineRankHigh;
public ushort TrivialSkillLineRankLow;
- public sbyte Flags;
+ public int Flags;
public byte NumSkillUps;
public short UniqueBit;
public short TradeSkillCategoryID;
@@ -205,7 +197,6 @@ namespace Game.DataStorage
{
public uint Id;
public int Base;
- public short PerLevel;
public int Minimum;
}
@@ -269,7 +260,6 @@ namespace Game.DataStorage
{
public uint Id;
public int Duration;
- public uint DurationPerLevel;
public int MaxDuration;
}
@@ -333,14 +323,16 @@ namespace Game.DataStorage
public sealed class SpellItemEnchantmentRecord
{
- public uint Id;
public string Name;
public string HordeName;
+ public uint Id;
public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects];
public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects];
- public uint TransmogPlayerConditionID;
- public uint TransmogCost;
public uint IconFileDataID;
+ public int MinItemLevel;
+ public int MaxItemLevel;
+ public uint TransmogUseConditionID;
+ public uint TransmogCost;
public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects];
public ushort ItemVisual;
public EnchantmentSlotMask Flags;
@@ -379,17 +371,17 @@ namespace Game.DataStorage
{
public uint Id;
public byte DifficultyID;
- public ushort BaseLevel;
public ushort MaxLevel;
- public ushort SpellLevel;
public byte MaxPassiveAuraLevel;
+ public ushort BaseLevel;
+ public ushort SpellLevel;
public uint SpellID;
}
public sealed class SpellMiscRecord
{
public uint Id;
- public int[] Attributes = new int[14];
+ public int[] Attributes = new int[15];
public byte DifficultyID;
public ushort CastingTimeIndex;
public ushort DurationIndex;
@@ -401,6 +393,9 @@ namespace Game.DataStorage
public uint SpellIconFileDataID;
public uint ActiveIconFileDataID;
public uint ContentTuningID;
+ public int ShowFutureSpellPlayerConditionID;
+ public int SpellVisualScript;
+ public int ActiveSpellVisualScript;
public uint SpellID;
}
@@ -447,7 +442,7 @@ namespace Game.DataStorage
{
public uint Id;
public SpellProcsPerMinuteModType Type;
- public ushort Param;
+ public uint Param;
public float Coeff;
public uint SpellProcsPerMinuteID;
}
@@ -550,7 +545,6 @@ namespace Game.DataStorage
public byte DifficultyID;
public uint SpellVisualID;
public float Probability;
- public byte Flags;
public byte Priority;
public int SpellIconFileID;
public int ActiveIconFileID;
diff --git a/Source/Game/DataStorage/Structs/T_Records.cs b/Source/Game/DataStorage/Structs/T_Records.cs
index 70e280eba..c57e6d19a 100644
--- a/Source/Game/DataStorage/Structs/T_Records.cs
+++ b/Source/Game/DataStorage/Structs/T_Records.cs
@@ -103,6 +103,15 @@ namespace Game.DataStorage
public int RequiredTransmogHoliday;
}
+ public sealed class TransmogIllusionRecord
+ {
+ public uint Id;
+ public int UnlockConditionID;
+ public int TransmogCost;
+ public int SpellItemEnchantmentID;
+ public int Flags;
+ }
+
public sealed class TransmogSetRecord
{
public string Name;
diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs
index 8e8ff08d0..0728220c8 100644
--- a/Source/Game/DataStorage/Structs/U_Records.cs
+++ b/Source/Game/DataStorage/Structs/U_Records.cs
@@ -27,15 +27,16 @@ namespace Game.DataStorage
public int Flags;
public int System;
public UiMapType Type;
- public uint LevelRangeMin;
- public uint LevelRangeMax;
public int BountySetID;
public uint BountyDisplayLocation;
public int VisibilityPlayerConditionID;
public sbyte HelpTextPosition;
public int BkgAtlasID;
public int AlternateUiMapGroup;
- }
+ public int ContentTuningID;
+
+ public UiMapFlag GetFlags() { return (UiMapFlag)Flags; }
+}
public sealed class UiMapAssignmentRecord
{
@@ -61,6 +62,7 @@ namespace Game.DataStorage
public int ChildUiMapID;
public int OverrideHighlightFileDataID;
public int OverrideHighlightAtlasID;
+ public int Flags;
}
public sealed class UiMapXMapArtRecord
diff --git a/Source/Game/DataStorage/Structs/V_Records.cs b/Source/Game/DataStorage/Structs/V_Records.cs
index eb0dd9ff2..18f249d2f 100644
--- a/Source/Game/DataStorage/Structs/V_Records.cs
+++ b/Source/Game/DataStorage/Structs/V_Records.cs
@@ -37,9 +37,9 @@ namespace Game.DataStorage
public float FacingLimitRight;
public float FacingLimitLeft;
public float CameraYawOffset;
- public byte UiLocomotionType;
public ushort VehicleUIIndicatorID;
public int MissileTargetingID;
+ public ushort VehiclePOITypeID;
public ushort[] SeatID = new ushort[8];
public ushort[] PowerDisplayID = new ushort[3];
}
diff --git a/Source/Game/DataStorage/WhoListStorage.cs b/Source/Game/DataStorage/WhoListStorage.cs
index a0dd19c7e..de05e312b 100644
--- a/Source/Game/DataStorage/WhoListStorage.cs
+++ b/Source/Game/DataStorage/WhoListStorage.cs
@@ -86,7 +86,7 @@ namespace Game.DataStorage
guildGuid = guild.GetGUID();
_whoListStorage.Add(new WhoListPlayerInfo(player.GetGUID(), player.GetTeam(), player.GetSession().GetSecurity(), player.GetLevel(),
- player.GetClass(), player.GetRace(), player.GetZoneId(), player.m_playerData.NativeSex, player.IsVisible(),
+ player.GetClass(), player.GetRace(), player.GetZoneId(), (byte)player.GetNativeSex(), player.IsVisible(),
player.IsGameMaster(), playerName, guildName, guildGuid));
}
}
diff --git a/Source/Game/DungeonFinding/LFGManager.cs b/Source/Game/DungeonFinding/LFGManager.cs
index 0be763bbf..b4da0ff3f 100644
--- a/Source/Game/DungeonFinding/LFGManager.cs
+++ b/Source/Game/DungeonFinding/LFGManager.cs
@@ -1535,10 +1535,6 @@ namespace Game.DungeonFinding
lockStatus = LfgLockStatusType.RaidLocked;
else if (dungeon.difficulty > Difficulty.Normal && player.GetBoundInstance(dungeon.map, dungeon.difficulty) != null)
lockStatus = LfgLockStatusType.RaidLocked;
- else if (dungeon.minlevel > level)
- lockStatus = LfgLockStatusType.TooLowLevel;
- else if (dungeon.maxlevel < level)
- lockStatus = LfgLockStatusType.TooHighLevel;
else if (dungeon.seasonal && !IsSeasonActive(dungeon.id))
lockStatus = LfgLockStatusType.NotInSeason;
else if (dungeon.requiredItemLevel > player.GetAverageItemLevel())
@@ -1560,16 +1556,23 @@ namespace Game.DungeonFinding
else if (ar.item2 != 0 && !player.HasItemCount(ar.item2))
lockStatus = LfgLockStatusType.MissingItem;
}
+ else
+ {
+ var levels = Global.DB2Mgr.GetContentTuningData(dungeon.contentTuningId, player.m_playerData.CtrOptions.GetValue().ContentTuningConditionMask);
+ if (levels.HasValue)
+ {
+ if (levels.Value.MinLevel > level)
+ lockStatus = LfgLockStatusType.TooLowLevel;
+ if (levels.Value.MaxLevel < level)
+ lockStatus = LfgLockStatusType.TooHighLevel;
+ }
+ }
/* @todo VoA closed if WG is not under team control (LFG_LOCKSTATUS_RAID_LOCKED)
lockData = LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE;
lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL;
lockData = LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL;
*/
- if (lockStatus == 0)
- {
-
- }
if (lockStatus != 0)
lockDic[dungeon.Entry()] = new LfgLockInfoData(lockStatus, dungeon.requiredItemLevel, player.GetAverageItemLevel());
}
@@ -1985,13 +1988,23 @@ namespace Game.DungeonFinding
return 0;
}
- public List GetRandomAndSeasonalDungeons(uint level, uint expansion)
+ public List GetRandomAndSeasonalDungeons(uint level, uint expansion, uint contentTuningReplacementConditionMask)
{
List randomDungeons = new List();
foreach (var dungeon in LfgDungeonStore.Values)
{
- if ((dungeon.seasonal && IsSeasonActive(dungeon.id) || !dungeon.seasonal && dungeon.type == LfgType.RandomDungeon) && dungeon.expansion <= expansion && dungeon.minlevel <= level && level <= dungeon.maxlevel)
- randomDungeons.Add(dungeon.Entry());
+ if (!(dungeon.type == LfgType.RandomDungeon || (dungeon.seasonal && Global.LFGMgr.IsSeasonActive(dungeon.id))))
+ continue;
+
+ if (dungeon.expansion > expansion)
+ continue;
+
+ var levels = Global.DB2Mgr.GetContentTuningData(dungeon.contentTuningId, contentTuningReplacementConditionMask);
+ if (levels.HasValue)
+ if (levels.Value.MinLevel > level || level > levels.Value.MaxLevel)
+ continue;
+
+ randomDungeons.Add(dungeon.Entry());
}
return randomDungeons;
}
@@ -2184,8 +2197,7 @@ namespace Game.DungeonFinding
type = dbc.TypeID;
expansion = dbc.ExpansionLevel;
group = dbc.GroupID;
- minlevel = dbc.MinLevel;
- maxlevel = dbc.MaxLevel;
+ contentTuningId = dbc.ContentTuningID;
difficulty = dbc.DifficultyID;
seasonal = dbc.Flags[0].HasAnyFlag(LfgFlags.Seasonal);
}
@@ -2196,8 +2208,7 @@ namespace Game.DungeonFinding
public LfgType type;
public uint expansion;
public uint group;
- public uint minlevel;
- public uint maxlevel;
+ public uint contentTuningId;
public Difficulty difficulty;
public bool seasonal;
public float x, y, z, o;
diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs
index c95ed5e80..aa9cb127e 100644
--- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs
+++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs
@@ -78,7 +78,7 @@ namespace Game.Entities
}
}
- bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisual spellVisual, ObjectGuid castId, AuraEffect aurEff)
+ bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId, AuraEffect aurEff)
{
_targetGuid = target ? target.GetGUID() : ObjectGuid.Empty;
_aurEff = aurEff;
@@ -110,7 +110,11 @@ namespace Game.Entities
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellID), spell.Id);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id);
- SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellXSpellVisualID), spellVisual.SpellXSpellVisualID);
+
+ SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellVisual);
+ SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID);
+ SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID);
+
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : m_areaTriggerData.Duration);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetTemplate().MaxSearchRadius);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetMiscTemplate().DecalPropertiesId);
@@ -197,7 +201,7 @@ namespace Game.Entities
return true;
}
- public static AreaTrigger CreateAreaTrigger(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisual spellVisual, ObjectGuid castId = default, AuraEffect aurEff = null)
+ public static AreaTrigger CreateAreaTrigger(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId = default, AuraEffect aurEff = null)
{
AreaTrigger at = new AreaTrigger();
if (!at.Create(spellMiscId, caster, target, spell, pos, duration, spellVisual, castId, aurEff))
diff --git a/Source/Game/Entities/Conversation.cs b/Source/Game/Entities/Conversation.cs
index 8a7151175..8f3453353 100644
--- a/Source/Game/Entities/Conversation.cs
+++ b/Source/Game/Entities/Conversation.cs
@@ -174,7 +174,7 @@ namespace Game.Entities
foreach (ushort actorIndex in actorIndices)
{
ConversationActor actor = actorIndex < m_conversationData.Actors.Size() ? m_conversationData.Actors[actorIndex] : null;
- if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty()))
+ if (actor == null || (actor.CreatureID == 0 && actor.ActorGUID.IsEmpty() && actor.NoActorObject == 0))
{
Log.outError(LogFilter.Conversation, $"Failed to create conversation (Id: {conversationEntry}) due to missing actor (Idx: {actorIndex}).");
return false;
diff --git a/Source/Game/Entities/Corpse.cs b/Source/Game/Entities/Corpse.cs
index fdb53a2cc..d7292377a 100644
--- a/Source/Game/Entities/Corpse.cs
+++ b/Source/Game/Entities/Corpse.cs
@@ -101,10 +101,6 @@ namespace Game.Entities
for (var i = 0; i < EquipmentSlot.End; ++i)
items.Append($"{m_corpseData.Items[i]} ");
- uint bytes1 = ((uint)m_corpseData.RaceID << 8) | ((uint)m_corpseData.Sex << 16) | ((uint)m_corpseData.SkinID << 24);
- uint bytes2 = ((uint)m_corpseData.FaceID) | ((uint)m_corpseData.HairStyleID << 8) | ((uint)m_corpseData.HairColorID << 16) | ((uint)m_corpseData.FacialHairStyleID << 24);
-
-
byte index = 0;
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE);
stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // guid
@@ -115,8 +111,8 @@ namespace Game.Entities
stmt.AddValue(index++, GetMapId()); // mapId
stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId
stmt.AddValue(index++, items.ToString()); // itemCache
- stmt.AddValue(index++, bytes1); // bytes1
- stmt.AddValue(index++, bytes2); // bytes2
+ stmt.AddValue(index++, m_corpseData.RaceID); // race
+ stmt.AddValue(index++, m_corpseData.Sex); // gender
stmt.AddValue(index++, (uint)m_corpseData.Flags); // flags
stmt.AddValue(index++, (uint)m_corpseData.DynamicFlags); // dynFlags
stmt.AddValue(index++, (uint)m_time); // time
@@ -132,6 +128,18 @@ namespace Game.Entities
stmt.AddValue(index++, phaseId); // PhaseId
trans.Append(stmt);
}
+
+ foreach (var customization in m_corpseData.Customizations)
+ {
+ index = 0;
+ stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_CORPSE_CUSTOMIZATIONS);
+ stmt.AddValue(index++, GetOwnerGUID().GetCounter()); // OwnerGuid
+ stmt.AddValue(index++, customization.ChrCustomizationOptionID);
+ stmt.AddValue(index++, customization.ChrCustomizationChoiceID);
+ trans.Append(stmt);
+ }
+
+ DB.Characters.CommitTransaction(trans);
}
public void DeleteFromDB(SQLTransaction trans)
@@ -148,12 +156,16 @@ namespace Game.Entities
stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CORPSE_PHASES);
stmt.AddValue(0, ownerGuid.GetCounter());
DB.Characters.ExecuteOrAppend(trans, stmt);
+
+ stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CORPSE_CUSTOMIZATIONS);
+ stmt.AddValue(0, ownerGuid.GetCounter());
+ DB.Characters.ExecuteOrAppend(trans, stmt);
}
public bool LoadCorpseFromDB(ulong guid, SQLFields field)
{
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
+ // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
float posX = field.Read(0);
float posY = field.Read(1);
@@ -169,15 +181,8 @@ namespace Game.Entities
for (uint index = 0; index < EquipmentSlot.End; ++index)
SetItem(index, uint.Parse(items[(int)index]));
- uint bytes1 = field.Read(7);
- uint bytes2 = field.Read(8);
- SetRace((Race)((bytes1 >> 8) & 0xFF));
- SetSex((Gender)((bytes1 >> 16) & 0xFF));
- SetSkin((byte)((bytes1 >> 24) & 0xFF));
- SetFace((byte)(bytes2 & 0xFF));
- SetHairStyle((byte)((bytes2 >> 8) & 0xFF));
- SetHairColor((byte)((bytes2 >> 16) & 0xFF));
- SetFacialHairStyle((byte)((bytes2 >> 24) & 0xFF));
+ SetRace((Race)field.Read(7));
+ SetSex((Gender)field.Read(8));
SetFlags((CorpseFlags)field.Read(9));
SetCorpseDynamicFlags((CorpseDynFlags)field.Read(10));
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read(14)));
@@ -287,15 +292,21 @@ namespace Game.Entities
public void SetDisplayId(uint displayId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DisplayID), displayId); }
public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), (byte)race); }
public void SetSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), (byte)sex); }
- public void SetSkin(byte skin) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.SkinID), skin); }
- public void SetFace(byte face) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FaceID), face); }
- public void SetHairStyle(byte hairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairStyleID), hairStyle); }
- public void SetHairColor(byte hairColor) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.HairColorID), hairColor); }
- public void SetFacialHairStyle(byte facialHairStyle) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FacialHairStyleID), facialHairStyle); }
public void SetFlags(CorpseFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Flags), (uint)flags); }
public void SetFactionTemplate(int factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FactionTemplate), factionTemplate); }
public void SetItem(uint slot, uint item) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Items, (int)slot), item); }
- public void SetCustomDisplayOption(uint slot, byte customDisplayOption) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.CustomDisplayOption, (int)slot), customDisplayOption); }
+
+ public void SetCustomizations(List customizations)
+ {
+ ClearDynamicUpdateFieldValues(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Customizations));
+ foreach (var customization in customizations)
+ {
+ var newChoice = new ChrCustomizationChoice();
+ newChoice.ChrCustomizationOptionID = customization.ChrCustomizationOptionID;
+ newChoice.ChrCustomizationChoiceID = customization.ChrCustomizationChoiceID;
+ AddDynamicUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Customizations), newChoice);
+ }
+ }
public long GetGhostTime() { return m_time; }
public void ResetGhostTime() { m_time = Time.UnixTime; }
diff --git a/Source/Game/Entities/DynamicObject.cs b/Source/Game/Entities/DynamicObject.cs
index 7a799821d..dabf293e6 100644
--- a/Source/Game/Entities/DynamicObject.cs
+++ b/Source/Game/Entities/DynamicObject.cs
@@ -77,7 +77,7 @@ namespace Game.Entities
}
}
- public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, SpellCastVisual spellVisual)
+ public bool CreateDynamicObject(ulong guidlow, Unit caster, SpellInfo spell, Position pos, float radius, DynamicObjectType type, SpellCastVisualField spellVisual)
{
SetMap(caster.GetMap());
Relocate(pos);
@@ -95,7 +95,11 @@ namespace Game.Entities
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Caster), caster.GetGUID());
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Type), (byte)type);
- SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellXSpellVisualID), spellVisual.SpellXSpellVisualID);
+
+ SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellVisual);
+ SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID);
+ SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID);
+
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.SpellID), spell.Id);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.Radius), radius);
SetUpdateFieldValue(m_values.ModifyValue(m_dynamicObjectData).ModifyValue(m_dynamicObjectData.CastTime), GameTime.GetGameTimeMS());
diff --git a/Source/Game/Entities/Item/AzeriteItem.cs b/Source/Game/Entities/Item/AzeriteItem.cs
index 8a9f9ac65..0361f5a0d 100644
--- a/Source/Game/Entities/Item/AzeriteItem.cs
+++ b/Source/Game/Entities/Item/AzeriteItem.cs
@@ -82,7 +82,7 @@ namespace Game.Entities
for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j)
stmt.AddValue(5 + specIndex * 5 + j, m_azeriteItemData.SelectedEssences[specIndex].AzeriteEssenceID[j]);
}
- for (; specIndex < PlayerConst.MaxSpecializations; ++specIndex)
+ for (; specIndex < 4; ++specIndex)
{
stmt.AddValue(4 + specIndex * 5, 0);
for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j)
@@ -557,6 +557,6 @@ namespace Game.Entities
public uint KnowledgeLevel;
public List AzeriteItemMilestonePowers = new List();
public List UnlockedAzeriteEssences = new List();
- public AzeriteItemSelectedEssencesData[] SelectedAzeriteEssences = new AzeriteItemSelectedEssencesData[PlayerConst.MaxSpecializations];
+ public AzeriteItemSelectedEssencesData[] SelectedAzeriteEssences = new AzeriteItemSelectedEssencesData[4];
}
}
diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs
index d5ed57fd8..816bd58e0 100644
--- a/Source/Game/Entities/Item/Item.cs
+++ b/Source/Game/Entities/Item/Item.cs
@@ -1009,10 +1009,9 @@ namespace Game.Entities
gemBonus.AddBonusList(bonusListId);
uint gemBaseItemLevel = gemTemplate.GetBaseItemLevel();
- ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(gemBonus.ScalingStatDistribution);
- if (ssd != null)
+ if (gemBonus.PlayerLevelToItemLevelCurveId != 0)
{
- uint scaledIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(ssd.PlayerLevelToItemLevelCurveID, gemScalingLevel);
+ uint scaledIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(gemBonus.PlayerLevelToItemLevelCurveId, gemScalingLevel);
if (scaledIlvl != 0)
gemBaseItemLevel = scaledIlvl;
}
@@ -1446,7 +1445,7 @@ namespace Game.Entities
Player owner = GetOwner();
for (byte i = 0; i < ItemConst.MaxStats; ++i)
{
- if ((owner ? GetItemStatValue(i, owner) : proto.GetItemStatAllocation(i)) != 0)
+ if ((owner ? GetItemStatValue(i, owner) : proto.GetStatPercentEditor(i)) != 0)
return true;
}
@@ -1457,7 +1456,7 @@ namespace Game.Entities
{
for (byte i = 0; i < ItemConst.MaxStats; ++i)
{
- if (bonus.ItemStatAllocation[i] != 0)
+ if (bonus.StatPercentEditor[i] != 0)
return true;
}
@@ -1767,22 +1766,18 @@ namespace Game.Entities
if (azeriteLevelInfo != null)
itemLevel = azeriteLevelInfo.ItemLevel;
- ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(bonusData.ScalingStatDistribution);
- if (ssd != null)
+ if (bonusData.PlayerLevelToItemLevelCurveId != 0)
{
if (fixedLevel != 0)
level = fixedLevel;
else
- level = (uint)Math.Min(Math.Max(level, ssd.MinLevel), ssd.MaxLevel);
+ {
+ var levels = Global.DB2Mgr.GetContentTuningData(bonusData.ContentTuningId, 0, true);
+ if (levels.HasValue)
+ level = (uint)Math.Min(Math.Max((ushort)level, levels.Value.MinLevel), levels.Value.MaxLevel);
+ }
- ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(bonusData.ContentTuningId);
- if (contentTuning != null)
- if ((Convert.ToBoolean(contentTuning.Flags & 2) || contentTuning.MinLevel != 0 || contentTuning.MaxLevel != 0) && !Convert.ToBoolean(contentTuning.Flags & 4))
- level = (uint)Math.Min(Math.Max(level, contentTuning.MinLevel), contentTuning.MaxLevel);
-
- uint heirloomIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(ssd.PlayerLevelToItemLevelCurveID, level);
- if (heirloomIlvl != 0)
- itemLevel = heirloomIlvl;
+ itemLevel = (uint)Global.DB2Mgr.GetCurveValueAt(bonusData.PlayerLevelToItemLevelCurveId, level);
}
itemLevel += (uint)bonusData.ItemLevelBonus;
@@ -1814,7 +1809,7 @@ namespace Game.Entities
{
case ItemModType.Corruption:
case ItemModType.CorruptionResistance:
- return _bonusData.ItemStatAllocation[index];
+ return _bonusData.StatPercentEditor[index];
default:
break;
}
@@ -1823,7 +1818,7 @@ namespace Game.Entities
uint randomPropPoints = ItemEnchantmentManager.GetRandomPropertyPoints(itemLevel, GetQuality(), GetTemplate().GetInventoryType(), GetTemplate().GetSubClass());
if (randomPropPoints != 0)
{
- float statValue = (_bonusData.ItemStatAllocation[index] * randomPropPoints) * 0.0001f;
+ float statValue = (_bonusData.StatPercentEditor[index] * randomPropPoints) * 0.0001f;
GtItemSocketCostPerLevelRecord gtCost = CliDB.ItemSocketCostPerLevelGameTable.GetRow(itemLevel);
if (gtCost != null)
statValue -= (_bonusData.ItemStatSocketCostMultiplier[index] * gtCost.SocketCost);
@@ -1881,11 +1876,11 @@ namespace Game.Entities
public uint GetDisplayId(Player owner)
{
- ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs;
- if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0)
- transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()];
+ uint itemModifiedAppearanceId = GetModifier(ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]);
+ if (itemModifiedAppearanceId == 0)
+ itemModifiedAppearanceId = GetModifier(ItemModifier.TransmogAppearanceAllSpecs);
- ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier));
+ ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId);
if (transmog != null)
{
ItemAppearanceRecord itemAppearance = CliDB.ItemAppearanceStorage.LookupByKey(transmog.ItemAppearanceID);
@@ -1903,51 +1898,57 @@ namespace Game.Entities
public uint GetModifier(ItemModifier modifier)
{
- if ((m_itemData.ModifiersMask & (1 << (int)modifier)) == 0)
- return 0;
+ int modifierIndex = m_itemData.Modifiers._value.Values.FindIndexIf(mod =>
+ {
+ return mod.Type == (byte)modifier;
+ });
- int valueIndex = 0;
- uint mask = m_itemData.ModifiersMask;
- for (int i = 0; i < (int)modifier; ++i)
- if ((mask & (1 << i)) != 0)
- ++valueIndex;
+ if (modifierIndex != -1)
+ return m_itemData.Modifiers._value.Values[modifierIndex].Value;
- return m_itemData.Modifiers[valueIndex];
+ return 0;
}
public void SetModifier(ItemModifier modifier, uint value)
{
- int valueIndex = 0;
- uint mask = m_itemData.ModifiersMask;
- for (int i = 0; i < (int)modifier; ++i)
- if ((mask & (1 << i)) != 0)
- ++valueIndex;
+ int modifierIndex = m_itemData.Modifiers._value.Values.FindIndexIf(mod =>
+ {
+ return mod.Type == (byte)modifier;
+ });
if (value != 0)
{
- if ((mask & (1 << (int)modifier)) != 0)
- return;
+ if (modifierIndex == -1)
+ {
+ ItemMod mod = new ItemMod();
+ mod.Value = value;
+ mod.Type = (byte)modifier;
- SetUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ModifiersMask), 1u << (int)modifier);
- InsertDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers), valueIndex, value);
+ AddDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers)._value.ModifyValue(m_itemData.Modifiers._value.Values), mod);
+ }
+ else
+ {
+ ItemModList itemModList = m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers);
+ itemModList.ModifyValue(itemModList.Values, modifierIndex);
+ SetUpdateFieldValue(ref itemModList.ModifyValue(itemModList.Values, modifierIndex).GetValue().Value, value);
+ }
}
else
{
- if ((mask & (1 << (int)modifier)) == 0)
+ if (modifierIndex == -1)
return;
- RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ModifiersMask), 1u << (int)modifier);
- RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers), valueIndex);
+ RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.Modifiers)._value.ModifyValue(m_itemData.Modifiers._value.Values), modifierIndex);
}
}
public uint GetVisibleEntry(Player owner)
{
- ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs;
- if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0)
- transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()];
+ uint itemModifiedAppearanceId = GetModifier(ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]);
+ if (itemModifiedAppearanceId == 0)
+ itemModifiedAppearanceId = GetModifier(ItemModifier.TransmogAppearanceAllSpecs);
- ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier));
+ ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId);
if (transmog != null)
return transmog.ItemID;
@@ -1956,11 +1957,11 @@ namespace Game.Entities
public ushort GetVisibleAppearanceModId(Player owner)
{
- ItemModifier transmogModifier = ItemModifier.TransmogAppearanceAllSpecs;
- if ((m_itemData.ModifiersMask & ItemConst.AppearanceModifierMaskSpecSpecific) != 0)
- transmogModifier = ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()];
+ uint itemModifiedAppearanceId = GetModifier(ItemConst.AppearanceModifierSlotBySpec[owner.GetActiveTalentGroup()]);
+ if (itemModifiedAppearanceId == 0)
+ itemModifiedAppearanceId = GetModifier(ItemModifier.TransmogAppearanceAllSpecs);
- ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(GetModifier(transmogModifier));
+ ItemModifiedAppearanceRecord transmog = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId);
if (transmog != null)
return transmog.ItemAppearanceModifierID;
@@ -1969,15 +1970,14 @@ namespace Game.Entities
public uint GetVisibleEnchantmentId(Player owner)
{
- ItemModifier illusionModifier = ItemModifier.EnchantIllusionAllSpecs;
- if ((m_itemData.ModifiersMask & ItemConst.IllusionModifierMaskSpecSpecific) != 0)
- illusionModifier = ItemConst.IllusionModifierSlotBySpec[owner.GetActiveTalentGroup()];
+ uint enchantmentId = GetModifier(ItemConst.IllusionModifierSlotBySpec[owner.GetActiveTalentGroup()]);
+ if (enchantmentId == 0)
+ enchantmentId = GetModifier(ItemModifier.EnchantIllusionAllSpecs);
- uint enchantIllusion = GetModifier(illusionModifier);
- if (enchantIllusion != 0)
- return enchantIllusion;
+ if (enchantmentId == 0)
+ enchantmentId = GetEnchantmentId(EnchantmentSlot.Perm);
- return (uint)GetEnchantmentId(EnchantmentSlot.Perm);
+ return enchantmentId;
}
public ushort GetVisibleItemVisual(Player owner)
@@ -2255,15 +2255,11 @@ namespace Game.Entities
if (!_bonusData.HasFixedLevel || GetModifier(ItemModifier.TimewalkerLevel) != 0)
return;
- ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(_bonusData.ScalingStatDistribution);
- if (ssd != null)
+ if (_bonusData.PlayerLevelToItemLevelCurveId != 0)
{
- level = (uint)Math.Min(Math.Max(level, ssd.MinLevel), ssd.MaxLevel);
-
- ContentTuningRecord contentTuning = CliDB.ContentTuningStorage.LookupByKey(_bonusData.ContentTuningId);
- if (contentTuning != null)
- if ((contentTuning.Flags.HasAnyFlag(2) || contentTuning.MinLevel != 0 || contentTuning.MaxLevel != 0) && !contentTuning.Flags.HasAnyFlag(4))
- level = (uint)Math.Min(Math.Max(level, contentTuning.MinLevel), contentTuning.MaxLevel);
+ var levels = Global.DB2Mgr.GetContentTuningData(_bonusData.ContentTuningId, 0, true);
+ if (levels.HasValue)
+ level = (uint)Math.Min(Math.Max((short)level, levels.Value.MinLevel), levels.Value.MaxLevel);
SetModifier(ItemModifier.TimewalkerLevel, level);
}
@@ -2271,12 +2267,14 @@ namespace Game.Entities
public int GetRequiredLevel()
{
+ int fixedLevel = (int)GetModifier(ItemModifier.TimewalkerLevel);
+ if (_bonusData.RequiredLevelCurve != 0)
+ return (int)Global.DB2Mgr.GetCurveValueAt(_bonusData.RequiredLevelCurve, fixedLevel);
if (_bonusData.RequiredLevelOverride != 0)
return _bonusData.RequiredLevelOverride;
- else if (_bonusData.HasFixedLevel)
- return (int)GetModifier(ItemModifier.TimewalkerLevel);
- else
- return _bonusData.RequiredLevel;
+ if (_bonusData.HasFixedLevel && _bonusData.PlayerLevelToItemLevelCurveId != 0)
+ return fixedLevel;
+ return _bonusData.RequiredLevel;
}
public static Item NewItemOrBag(ItemTemplate proto)
@@ -2515,7 +2513,7 @@ namespace Game.Entities
public uint GetAppearanceModId() { return m_itemData.ItemAppearanceModID; }
public void SetAppearanceModId(uint appearanceModId) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.ItemAppearanceModID), (byte)appearanceModId); }
public float GetRepairCostMultiplier() { return _bonusData.RepairCostMultiplier; }
- public uint GetScalingStatDistribution() { return _bonusData.ScalingStatDistribution; }
+ public uint GetScalingContentTuningId() { return _bonusData.ContentTuningId; }
public void SetRefundRecipient(ObjectGuid guid) { m_refundRecipient = guid; }
public void SetPaidMoney(ulong money) { m_paidMoney = money; }
@@ -2685,13 +2683,13 @@ namespace Game.Entities
ItemLevelBonus = 0;
RequiredLevel = proto.GetBaseRequiredLevel();
for (uint i = 0; i < ItemConst.MaxStats; ++i)
- ItemStatType[i] = proto.GetItemStatType(i);
+ ItemStatType[i] = proto.GetStatModifierBonusStat(i);
for (uint i = 0; i < ItemConst.MaxStats; ++i)
- ItemStatAllocation[i] = proto.GetItemStatAllocation(i);
+ StatPercentEditor[i] = proto.GetStatPercentEditor(i);
for (uint i = 0; i < ItemConst.MaxStats; ++i)
- ItemStatSocketCostMultiplier[i] = proto.GetItemStatSocketCostMultiplier(i);
+ ItemStatSocketCostMultiplier[i] = proto.GetStatPercentageOfSocket(i);
for (uint i = 0; i < ItemConst.MaxGemSockets; ++i)
{
@@ -2705,7 +2703,8 @@ namespace Game.Entities
AppearanceModID = 0;
RepairCostMultiplier = 1.0f;
- ScalingStatDistribution = proto.GetScalingStatDistribution();
+ ContentTuningId = proto.GetScalingStatContentTuning();
+ PlayerLevelToItemLevelCurveId = proto.GetPlayerLevelToItemLevelCurveId();
RelicType = -1;
HasFixedLevel = false;
RequiredLevelOverride = 0;
@@ -2729,6 +2728,7 @@ namespace Game.Entities
_state.AppearanceModPriority = int.MaxValue;
_state.ScalingStatDistributionPriority = int.MaxValue;
_state.AzeriteTierUnlockSetPriority = int.MaxValue;
+ _state.RequiredLevelCurvePriority = int.MaxValue;
_state.HasQualityBonus = false;
}
@@ -2766,7 +2766,7 @@ namespace Game.Entities
if (statIndex < ItemConst.MaxStats)
{
ItemStatType[statIndex] = values[0];
- ItemStatAllocation[statIndex] += values[1];
+ StatPercentEditor[statIndex] += values[1];
}
break;
}
@@ -2816,8 +2816,8 @@ namespace Game.Entities
case ItemBonusType.ScalingStatDistributionFixed:
if (values[1] < _state.ScalingStatDistributionPriority)
{
- ScalingStatDistribution = (uint)values[0];
ContentTuningId = (uint)values[2];
+ PlayerLevelToItemLevelCurveId = (uint)values[3];
_state.ScalingStatDistributionPriority = values[1];
HasFixedLevel = type == ItemBonusType.ScalingStatDistributionFixed;
}
@@ -2849,6 +2849,15 @@ namespace Game.Entities
if (itemEffect != null)
Effects[EffectCount++] = itemEffect;
break;
+ case ItemBonusType.RequiredLevelCurve:
+ if (values[2] < _state.RequiredLevelCurvePriority)
+ {
+ RequiredLevelCurve = (uint)values[0];
+ _state.RequiredLevelCurvePriority = values[2];
+ if (values[1] != 0)
+ ContentTuningId = (uint)values[1];
+ }
+ break;
}
}
@@ -2856,14 +2865,14 @@ namespace Game.Entities
public int ItemLevelBonus;
public int RequiredLevel;
public int[] ItemStatType = new int[ItemConst.MaxStats];
- public int[] ItemStatAllocation = new int[ItemConst.MaxStats];
+ public int[] StatPercentEditor = new int[ItemConst.MaxStats];
public float[] ItemStatSocketCostMultiplier = new float[ItemConst.MaxStats];
public SocketColor[] socketColor = new SocketColor[ItemConst.MaxGemSockets];
public ItemBondingType Bonding;
public uint AppearanceModID;
public float RepairCostMultiplier;
- public uint ScalingStatDistribution;
public uint ContentTuningId;
+ public uint PlayerLevelToItemLevelCurveId;
public uint DisenchantLootId;
public uint[] GemItemLevelBonus = new uint[ItemConst.MaxGemSockets];
public int[] GemRelicType = new int[ItemConst.MaxGemSockets];
@@ -2872,6 +2881,7 @@ namespace Game.Entities
public int RequiredLevelOverride;
public uint AzeriteTierUnlockSetId;
public uint Suffix;
+ public uint RequiredLevelCurve;
public ItemEffectRecord[] Effects = new ItemEffectRecord[13];
public int EffectCount;
public bool CanDisenchant;
@@ -2885,6 +2895,7 @@ namespace Game.Entities
public int AppearanceModPriority;
public int ScalingStatDistributionPriority;
public int AzeriteTierUnlockSetPriority;
+ public int RequiredLevelCurvePriority;
public bool HasQualityBonus;
}
}
@@ -2972,7 +2983,7 @@ namespace Game.Entities
info.AzeriteItem.Xp = azeriteItemResult.Read(1);
info.AzeriteItem.Level = azeriteItemResult.Read(2);
info.AzeriteItem.KnowledgeLevel = azeriteItemResult.Read(3);
- for (int i = 0; i < PlayerConst.MaxSpecializations; ++i)
+ for (int i = 0; i < info.AzeriteItem.SelectedAzeriteEssences.Length; ++i)
{
uint specializationId = azeriteItemResult.Read(4 + i * 4);
if (!CliDB.ChrSpecializationStorage.ContainsKey(specializationId))
diff --git a/Source/Game/Entities/Item/ItemTemplate.cs b/Source/Game/Entities/Item/ItemTemplate.cs
index e8e928792..14f973261 100644
--- a/Source/Game/Entities/Item/ItemTemplate.cs
+++ b/Source/Game/Entities/Item/ItemTemplate.cs
@@ -277,22 +277,11 @@ namespace Game.Entities
public uint GetRequiredReputationRank() { return ExtendedData.MinReputation; }
public uint GetMaxCount() { return ExtendedData.MaxCount; }
public uint GetContainerSlots() { return ExtendedData.ContainerSlots; }
- public int GetItemStatType(uint index)
- {
- Cypher.Assert(index < ItemConst.MaxStats);
- return ExtendedData.StatModifierBonusStat[index];
- }
- public int GetItemStatAllocation(uint index)
- {
- Cypher.Assert(index < ItemConst.MaxStats);
- return ExtendedData.StatPercentEditor[index];
- }
- public float GetItemStatSocketCostMultiplier(uint index)
- {
- Cypher.Assert(index < ItemConst.MaxStats);
- return ExtendedData.StatPercentageOfSocket[index];
- }
- public uint GetScalingStatDistribution() { return ExtendedData.ScalingStatDistributionID; }
+ public int GetStatModifierBonusStat(uint index) { Cypher.Assert(index < ItemConst.MaxStats); return ExtendedData.StatModifierBonusStat[index]; }
+ public int GetStatPercentEditor(uint index) { Cypher.Assert(index < ItemConst.MaxStats); return ExtendedData.StatPercentEditor[index]; }
+ public float GetStatPercentageOfSocket(uint index) { Cypher.Assert(index < ItemConst.MaxStats); return ExtendedData.StatPercentageOfSocket[index]; }
+ public uint GetScalingStatContentTuning() { return ExtendedData.ContentTuningID; }
+ public uint GetPlayerLevelToItemLevelCurveId() { return ExtendedData.PlayerLevelToItemLevelCurveID; }
public uint GetDamageType() { return ExtendedData.DamageType; }
public uint GetDelay() { return ExtendedData.ItemDelay; }
public float GetRangedModRange() { return ExtendedData.ItemRange; }
diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs
index bd7169ff6..3cedbbd5b 100644
--- a/Source/Game/Entities/Object/Update/UpdateFields.cs
+++ b/Source/Game/Entities/Object/Update/UpdateFields.cs
@@ -16,13 +16,13 @@
*/
using Framework.Constants;
+using Framework.Dynamic;
+using Framework.GameMath;
+using Game.DataStorage;
using Game.Networking;
+using Game.Spells;
using System;
using System.Collections.Generic;
-using Framework.GameMath;
-using Game.Spells;
-using Game.DataStorage;
-using Framework.Dynamic;
namespace Game.Entities
{
@@ -45,8 +45,8 @@ namespace Game.Entities
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
-
- public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, WorldObject owner, Player receiver)
+
+ public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, WorldObject owner, Player receiver)
{
data.WriteBits(changesMask.GetBlock(0), 4);
@@ -204,6 +204,82 @@ namespace Game.Entities
}
}
+ public class ItemMod
+ {
+ public uint Value;
+ public byte Type;
+
+ public void WriteCreate(WorldPacket data, Item owner, Player receiver)
+ {
+ data.WriteUInt32(Value);
+ data.WriteUInt8(Type);
+ }
+
+ public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Item owner, Player receiver)
+ {
+ data.WriteUInt32(Value);
+ data.WriteUInt8(Type);
+ }
+ }
+
+ public class ItemModList : BaseUpdateData-
+ {
+ public DynamicUpdateField Values = new DynamicUpdateField(0, 0);
+
+ public ItemModList() : base(1) { }
+
+ public void WriteCreate(WorldPacket data, Item owner, Player receiver)
+ {
+ data.WriteBits(Values.Size(), 6);
+ for (int i = 0; i < Values.Size(); ++i)
+ {
+ Values[i].WriteCreate(data, owner, receiver);
+ }
+ data.FlushBits();
+ }
+
+ public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Item owner, Player receiver)
+ {
+ UpdateMask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 1);
+
+ if (changesMask[0])
+ {
+ if (changesMask[0])
+ {
+ if (!ignoreChangesMask)
+ Values.WriteUpdateMask(data, 6);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Values.Size(), data, 6);
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[0])
+ {
+ for (int i = 0; i < Values.Size(); ++i)
+ {
+ if (Values.HasChanged(i) || ignoreChangesMask)
+ {
+ Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ }
+ }
+ data.FlushBits();
+ }
+
+ public override void ClearChangesMask()
+ {
+ ClearChangesMask(Values);
+ _changesMask.ResetAll();
+ }
+ }
+
public class ArtifactPower
{
public ushort ArtifactPowerId;
@@ -288,23 +364,23 @@ namespace Game.Entities
public class ItemData : BaseUpdateData
-
{
public UpdateField
> BonusListIDs = new UpdateField>(0, 1);
- public DynamicUpdateField Modifiers = new DynamicUpdateField(0, 2);
- public DynamicUpdateField ArtifactPowers = new DynamicUpdateField(0, 3);
- public DynamicUpdateField Gems = new DynamicUpdateField(0, 4);
- public UpdateField Owner = new UpdateField(0, 5);
- public UpdateField ContainedIn = new UpdateField(0, 6);
- public UpdateField Creator = new UpdateField(0, 7);
- public UpdateField GiftCreator = new UpdateField(0, 8);
- public UpdateField StackCount = new UpdateField(0, 9);
- public UpdateField Expiration = new UpdateField(0, 10);
- public UpdateField DynamicFlags = new UpdateField(0, 11);
- public UpdateField Durability = new UpdateField(0, 12);
- public UpdateField MaxDurability = new UpdateField(0, 13);
- public UpdateField CreatePlayedTime = new UpdateField(0, 14);
- public UpdateField ModifiersMask = new UpdateField(0, 15);
- public UpdateField Context = new UpdateField(0, 16);
- public UpdateField ArtifactXP = new UpdateField(0, 17);
- public UpdateField ItemAppearanceModID = new UpdateField(0, 18);
+ public DynamicUpdateField ArtifactPowers = new DynamicUpdateField(0, 2);
+ public DynamicUpdateField Gems = new DynamicUpdateField(0, 3);
+ public UpdateField Owner = new UpdateField(0, 4);
+ public UpdateField ContainedIn = new UpdateField(0, 5);
+ public UpdateField Creator = new UpdateField(0, 6);
+ public UpdateField GiftCreator = new UpdateField(0, 7);
+ public UpdateField StackCount = new UpdateField(0, 8);
+ public UpdateField Expiration = new UpdateField(0, 9);
+ public UpdateField DynamicFlags = new UpdateField(0, 10);
+ public UpdateField Durability = new UpdateField(0, 11);
+ public UpdateField MaxDurability = new UpdateField(0, 12);
+ public UpdateField CreatePlayedTime = new UpdateField(0, 13);
+ public UpdateField Context = new UpdateField(0, 14);
+ public UpdateField CreateTime = new UpdateField(0, 15);
+ public UpdateField ArtifactXP = new UpdateField(0, 16);
+ public UpdateField ItemAppearanceModID = new UpdateField(0, 17);
+ public UpdateField Modifiers = new UpdateField(0, 18);
public UpdateField DynamicFlags2 = new UpdateField(0, 19);
public UpdateFieldArray SpellCharges = new UpdateFieldArray(5, 20, 21);
public UpdateFieldArray Enchantment = new UpdateFieldArray(13, 26, 27);
@@ -342,27 +418,19 @@ namespace Game.Entities
data.WriteUInt32(MaxDurability);
}
data.WriteUInt32(CreatePlayedTime);
- if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
- {
- data.WriteUInt32(ModifiersMask);
- }
data.WriteInt32(Context);
+ data.WriteInt32(CreateTime);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
{
data.WriteUInt64(ArtifactXP);
data.WriteUInt8(ItemAppearanceModID);
}
- data.WriteInt32(Modifiers.Size());
data.WriteInt32(ArtifactPowers.Size());
data.WriteInt32(Gems.Size());
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
{
data.WriteUInt32(DynamicFlags2);
}
- for (int i = 0; i < Modifiers.Size(); ++i)
- {
- data.WriteUInt32(Modifiers[i]);
- }
for (int i = 0; i < ArtifactPowers.Size(); ++i)
{
ArtifactPowers[i].WriteCreate(data, owner, receiver);
@@ -371,11 +439,12 @@ namespace Game.Entities
{
Gems[i].WriteCreate(data, owner, receiver);
}
+ ((ItemModList)Modifiers).WriteCreate(data, owner, receiver);
}
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver)
{
- UpdateMask allowedMaskForTarget = new UpdateMask(40, new uint[] { 0xFC0149FFu, 0x000000FFu });
+ UpdateMask allowedMaskForTarget = new UpdateMask(40, new uint[] { 0xFC04E4FFu, 0x000000FFu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -383,15 +452,15 @@ namespace Game.Entities
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
- allowedMaskForTarget |= new UpdateMask(40, new uint[] { 0x03FEB600u, 0x00000000u });
+ allowedMaskForTarget |= new UpdateMask(40, new uint[] { 0x03FB1B00u, 0x00000000u });
}
public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags)
{
if (!fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
- changesMask &= new UpdateMask(40, new uint[] { 0xFC0149FFu, 0xFFFFFFFFu });
+ changesMask &= new UpdateMask(40, new uint[] { 0xFC04E4FFu, 0xFFFFFFFFu });
}
-
+
public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Item owner, Player receiver)
{
data.WriteBits(changesMask.GetBlocksMask(0), 2);
@@ -413,20 +482,13 @@ namespace Game.Entities
if (changesMask[0])
{
if (changesMask[2])
- {
- if (!ignoreNestedChangesMask)
- Modifiers.WriteUpdateMask(data);
- else
- WriteCompleteDynamicFieldUpdateMask(Modifiers.Size(), data);
- }
- if (changesMask[3])
{
if (!ignoreNestedChangesMask)
ArtifactPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ArtifactPowers.Size(), data);
}
- if (changesMask[4])
+ if (changesMask[3])
{
if (!ignoreNestedChangesMask)
Gems.WriteUpdateMask(data);
@@ -438,16 +500,6 @@ namespace Game.Entities
if (changesMask[0])
{
if (changesMask[2])
- {
- for (int i = 0; i < Modifiers.Size(); ++i)
- {
- if (Modifiers.HasChanged(i) || ignoreNestedChangesMask)
- {
- data.WriteUInt32(Modifiers[i]);
- }
- }
- }
- if (changesMask[3])
{
for (int i = 0; i < ArtifactPowers.Size(); ++i)
{
@@ -457,7 +509,7 @@ namespace Game.Entities
}
}
}
- if (changesMask[4])
+ if (changesMask[3])
{
for (int i = 0; i < Gems.Size(); ++i)
{
@@ -467,59 +519,59 @@ namespace Game.Entities
}
}
}
- if (changesMask[5])
+ if (changesMask[4])
{
data.WritePackedGuid(Owner);
}
- if (changesMask[6])
+ if (changesMask[5])
{
data.WritePackedGuid(ContainedIn);
}
- if (changesMask[7])
+ if (changesMask[6])
{
data.WritePackedGuid(Creator);
}
- if (changesMask[8])
+ if (changesMask[7])
{
data.WritePackedGuid(GiftCreator);
}
- if (changesMask[9])
+ if (changesMask[8])
{
data.WriteUInt32(StackCount);
}
- if (changesMask[10])
+ if (changesMask[9])
{
data.WriteUInt32(Expiration);
}
- if (changesMask[11])
+ if (changesMask[10])
{
data.WriteUInt32(DynamicFlags);
}
- if (changesMask[12])
+ if (changesMask[11])
{
data.WriteUInt32(Durability);
}
- if (changesMask[13])
+ if (changesMask[12])
{
data.WriteUInt32(MaxDurability);
}
- if (changesMask[14])
+ if (changesMask[13])
{
data.WriteUInt32(CreatePlayedTime);
}
- if (changesMask[15])
- {
- data.WriteUInt32(ModifiersMask);
- }
- if (changesMask[16])
+ if (changesMask[14])
{
data.WriteInt32(Context);
}
- if (changesMask[17])
+ if (changesMask[15])
+ {
+ data.WriteInt32(CreateTime);
+ }
+ if (changesMask[16])
{
data.WriteUInt64(ArtifactXP);
}
- if (changesMask[18])
+ if (changesMask[17])
{
data.WriteUInt8(ItemAppearanceModID);
}
@@ -527,6 +579,10 @@ namespace Game.Entities
{
data.WriteUInt32(DynamicFlags2);
}
+ if (changesMask[18])
+ {
+ ((ItemModList)Modifiers).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
}
if (changesMask[20])
{
@@ -553,7 +609,6 @@ namespace Game.Entities
public override void ClearChangesMask()
{
ClearChangesMask(BonusListIDs);
- ClearChangesMask(Modifiers);
ClearChangesMask(ArtifactPowers);
ClearChangesMask(Gems);
ClearChangesMask(Owner);
@@ -566,10 +621,11 @@ namespace Game.Entities
ClearChangesMask(Durability);
ClearChangesMask(MaxDurability);
ClearChangesMask(CreatePlayedTime);
- ClearChangesMask(ModifiersMask);
ClearChangesMask(Context);
+ ClearChangesMask(CreateTime);
ClearChangesMask(ArtifactXP);
ClearChangesMask(ItemAppearanceModID);
+ ClearChangesMask(Modifiers);
ClearChangesMask(DynamicFlags2);
ClearChangesMask(SpellCharges);
ClearChangesMask(Enchantment);
@@ -762,16 +818,17 @@ namespace Game.Entities
public class AzeriteItemData : BaseUpdateData
{
- public DynamicUpdateField UnlockedEssences = new DynamicUpdateField(0, 1);
- public DynamicUpdateField SelectedEssences = new DynamicUpdateField(0, 2);
- public DynamicUpdateField UnlockedEssenceMilestones = new DynamicUpdateField(0, 3);
- public UpdateField Xp = new UpdateField(0, 4);
- public UpdateField Level = new UpdateField(0, 5);
- public UpdateField AuraLevel = new UpdateField(0, 6);
- public UpdateField KnowledgeLevel = new UpdateField(0, 7);
- public UpdateField DEBUGknowledgeWeek = new UpdateField(0, 8);
+ public UpdateField Enabled = new UpdateField(0, 1);
+ public DynamicUpdateFieldUnlockedEssences = new DynamicUpdateField(0, 2);
+ public DynamicUpdateFieldUnlockedEssenceMilestones = new DynamicUpdateField(0, 4);
+ public DynamicUpdateFieldSelectedEssences = new DynamicUpdateField(0, 3);
+ public UpdateField Xp = new UpdateField(0, 5);
+ public UpdateField