diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index fa81a36b9..806fec794 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -450,8 +450,21 @@ namespace Framework.Constants PlayerWeaponHighWatermarkAboveOrEqual = 375, /*NYI*/ PlayerHeadHighWatermarkAboveOrEqual = 376, /*NYI*/ PlayerHasDisplayedCurrencyLessThan = 377, /*NYI*/ // Player has {CurrencyTypes} less than {#Amount} (value visible in ui is taken into account, not raw value) - + PlayerDataFlagAccountIsSet = 387, /*NYI*/ // Player {PlayerDataFlagAccount} is set + PlayerDataFlagCharacterIsSet = 389, /*NYI*/ // Player {PlayerDataFlagCharacter} is set PlayerIsOnMapWithExpansion = 380, // Player is on map that has {ExpansionID} + + PlayerHasCompletedQuestOnAccount = 382, /*NYI*/ // Player has previously completed quest "{QuestV2}" on account + PlayerHasCompletedQuestlineOnAccount = 383, /*NYI*/ // Player has completed questline "{Questline}" on account + PlayerHasCompletedQuestlineQuestCountOnAccount = 384, /*NYI*/ // Player has completed "{#Quests}" quests in questline "{Questline}" on account + PlayerHasActiveTraitSubTree = 385, // Player has active trait config with {TraitSubTree} + + PlayerIsInSoloRBG = 387, /*NYI*/ // Player is in solo RBG (BG Blitz) + PlayerHasCompletedCampaign = 388, /*NYI*/ // Player has completed campaign "{Campaign}" + TargetCreatureClassificationEqual = 389, // Creature classification is {CreatureClassification} + PlayerDataElementCharacterEqual = 390, /*NYI*/ // Player {PlayerDataElementCharacter} is greater than {#Amount} + PlayerDataElementAccountEqual = 391, /*NYI*/ // Player {PlayerDataElementAccount} is greater than {#Amount} + PlayerHasCompletedQuestOrIsReadyToTurnIn = 392, // Player has previously completed quest "{QuestV2}" or is ready to turn it in } public enum CriteriaFailEvent : byte @@ -755,9 +768,9 @@ namespace Framework.Constants CompleteQuestsCountOnAccount = 257, /*NYI*/ WarbandBankTabPurchased = 260, /*NYI*/ - + ReachRenownLevel = 261, LearnTaxiNode = 262, - Count = 263 + Count = 264 } public enum CriteriaDataType diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index 518c744ce..1e93dc592 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -47,7 +47,7 @@ namespace Framework.Constants RacialForThePurposeOfTemporaryRaceChange = 0x8000, } - public enum AbilityLearnType : byte + public enum AbilityLearnType : int { OnSkillValue = 1, // Spell state will update depending on skill value OnSkillLearn = 2, // Spell will be learned/removed together with entire skill @@ -1096,7 +1096,11 @@ namespace Framework.Constants UseTotalEarnedForEarned = 0x01, ShowQuestXPGainInTooltip = 0x02, // NYI NoNotificationMailOnOfflineProgress = 0x04, // NYI - BattlenetVirtualCurrency = 0x08 // NYI + BattlenetVirtualCurrency = 0x08, // NYI + FutureCurrencyFlag = 0x10, // NYI + DontDisplayIfZero = 0x20, // NYI + ScaleMaxQuantityBySeasonWeeks = 0x40, // NYI + ScaleMaxQuantityByWeeksSinceStart = 0x80, // NYI } [Flags] @@ -2498,7 +2502,8 @@ namespace Framework.Constants Available = 0, Visible = 1, Granted = 2, - Increased = 3 + Increased = 3, + DisplayError = 4 } public enum TraitConfigType @@ -2551,7 +2556,8 @@ namespace Framework.Constants { Single = 0, Tiered = 1, - Selection = 2 + Selection = 2, + SubTreeSelection = 3 } public enum TraitPointsOperationType diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index acc8d5791..0f5569d1d 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -329,6 +329,9 @@ namespace Framework.Constants OnPickup = 5, OnLearn = 6, // used in itemtemplate.spell2 with spellid with SPELLGENERICLEARN in spell1 OnLooted = 7, + TeachMount = 8, + OnPickupForced = 9, + OnLootedForced = 10, Max } @@ -561,8 +564,11 @@ namespace Framework.Constants DungeonNormalJackpot = 101, DungeonHeroicJackpot = 102, DungeonMythicJackpot = 103, - Delves = 104, + Delves1 = 104, Timerunning = 105, + Delves2 = 106, + Delves3 = 107, + DelvesJackpot = 108, Max } @@ -669,6 +675,11 @@ namespace Framework.Constants OnEquip = 2, OnUse = 3, Quest = 4, + Unused1 = 5, + Unused2 = 6, + WowAccount = 7, + BnetAccount = 8, + BnetAccountUntilEquipped = 9, } public enum ItemClass : sbyte diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index f40ae3346..e6301f0c6 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -514,7 +514,7 @@ namespace Framework.Constants ModHealingTakenFromCaster = 504, ModPlayerChoiceRerolls = 505, // NYI DisableInertia = 506, // NYI - ModDamageTakenFromCasterByLabel = 507, + ModDamageTakenByLabel = 507, Unk508 = 508, Unk509 = 509, ModifiedRaidInstance = 510, // NYI; Related to "Fated" raid affixes @@ -544,14 +544,109 @@ namespace Framework.Constants Unk534 = 534, Unk535 = 535, IgnoreSpellCreatureTypeRequirements = 536, - Unk537 = 537, + ModSpellDamageFromCasterByLabel = 537, ModFakeInebriationMovementOnly = 538, AllowMountInCombat = 539, ModSupportStat = 540, // NYI ModRequiredMountCapabilityFlags = 541, - Unk542 = 542, + TriggerSpellOnStackAmount = 542, // NYI Unk543 = 543, Unk544 = 544, + Unk545 = 545, // prevent swim + Unk546 = 546, + Unk547 = 547, + Unk548 = 548, + Unk549 = 549, + Unk550 = 550, + Unk551 = 551, + Unk552 = 552, + Unk553 = 553, + Unk554 = 554, + Unk555 = 555, + Unk556 = 556, + Unk557 = 557, + Unk558 = 558, + Unk559 = 559, + Unk560 = 560, + Unk561 = 561, + Unk562 = 562, + Unk563 = 563, + Unk564 = 564, + Unk565 = 565, + Unk566 = 566, + Unk567 = 567, + Unk568 = 568, + Unk569 = 569, + Unk570 = 570, + Unk571 = 571, + Unk572 = 572, + Unk573 = 573, + Unk574 = 574, + Unk575 = 575, + Unk576 = 576, + Unk577 = 577, + Unk578 = 578, + Unk579 = 579, + Unk580 = 580, + Unk581 = 581, + Unk582 = 582, + Unk583 = 583, + Unk584 = 584, + Unk585 = 585, + Unk586 = 586, + Unk587 = 587, + Unk588 = 588, + Unk589 = 589, + Unk590 = 590, + Unk591 = 591, + Unk592 = 592, + Unk593 = 593, + Unk594 = 594, + Unk595 = 595, + Unk596 = 596, + Unk597 = 597, + Unk598 = 598, + Unk599 = 599, + Unk600 = 600, + Unk601 = 601, + Unk602 = 602, + Unk603 = 603, + Unk604 = 604, + Unk605 = 605, + Unk606 = 606, + Unk607 = 607, + Unk608 = 608, + Unk609 = 609, + Unk610 = 610, + Unk611 = 611, + Unk612 = 612, + Unk613 = 613, + Unk614 = 614, + Unk615 = 615, + Unk616 = 616, + Unk617 = 617, + Unk618 = 618, + Unk619 = 619, + Unk620 = 620, + Unk621 = 621, + Unk622 = 622, + Unk623 = 623, + Unk624 = 624, + Unk625 = 625, + Unk626 = 626, + Unk627 = 627, + Unk628 = 628, + Unk629 = 629, + Unk630 = 630, + Unk631 = 631, + Unk632 = 632, + Unk633 = 633, + Unk634 = 634, + Unk635 = 635, + Unk636 = 636, + ModExplorationExperience = 637, + ModCriticalBlockAmount = 638, + Unk639 = 639, Total } diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs index 9b502f3b1..404ad2e05 100644 --- a/Source/Framework/Constants/Spells/SpellConst.cs +++ b/Source/Framework/Constants/Spells/SpellConst.cs @@ -2565,6 +2565,24 @@ namespace Framework.Constants ChangeItemBonuses2 = 313, // MiscValue[0] = ItemBonusTreeID to preserve AddSocketBonus = 314, // MiscValue[0] = required ItemBonusTreeID LearnTransmogAppearanceFromItemModAppearanceGroup = 315, // MiscValue[0] = ItemModAppearanceGroupID (not in db2) + KillCreditLbael1 = 316, + KillCreditLabel2 = 317, + Unk318 = 318, + Unk319 = 319, + Unk320 = 320, + Unk321 = 321, + Unk322 = 322, + Unk323 = 323, + Unk324 = 324, + Unk325 = 325, + Unk326 = 326, + Unk327 = 327, + Unk328 = 328, + Unk329 = 329, + Unk330 = 330, + Unk331 = 331, + Unk332 = 332, + Unk333 = 333, TotalSpellEffects } diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index 08aba4e5c..827c2f48a 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -195,12 +195,15 @@ namespace Framework.Database // BattlemasterList.db2 PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " + - "RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID, " + - "MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16" + + "RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID" + " FROM battlemaster_list WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang" + " FROM battlemaster_list_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); + // BattlemasterListXMap.db2 + PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST_X_MAP, "SELECT ID, MapID, BattlemasterListID FROM battlemaster_list_x_map" + + " WHERE (`VerifiedBuild` > 0) = ?"); + // BroadcastText.db2 PrepareStatement(HotfixStatements.SEL_BROADCAST_TEXT, "SELECT `Text`, Text1, ID, LanguageID, ConditionID, EmotesID, Flags, ChatBubbleDurationMs, " + "VoiceOverPriorityID, SoundKitID1, SoundKitID2, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3 FROM broadcast_text" + @@ -222,8 +225,8 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ?"); // ChallengeModeItemBonusOverride.db2 - PrepareStatement(HotfixStatements.SEL_CHALLENGE_MODE_ITEM_BONUS_OVERRIDE, "SELECT ID, ItemBonusTreeGroupID, DstItemBonusTreeID, Type, Value, " + - "MythicPlusSeasonID, PvPSeasonID, SrcItemBonusTreeID FROM challenge_mode_item_bonus_override WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_CHALLENGE_MODE_ITEM_BONUS_OVERRIDE, "SELECT ID, ItemBonusTreeGroupID, DstItemBonusTreeID, Value, " + + "RequiredTimeEventPassed, SrcItemBonusTreeID FROM challenge_mode_item_bonus_override WHERE (`VerifiedBuild` > 0) = ?"); // CharBaseInfo.db2 PrepareStatement(HotfixStatements.SEL_CHAR_BASE_INFO, "SELECT ID, RaceID, ClassID, OtherFactionRaceID FROM char_base_info WHERE (`VerifiedBuild` > 0) = ?"); @@ -286,9 +289,9 @@ namespace Framework.Database "ChrCustGeoComponentLinkID FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?"); // ChrCustomizationOption.db2 - PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " + - "OptionType, BarberShopCostModifier, ChrCustomizationID, ChrCustomizationReqID, UiOrderIndex, AddedInPatch FROM chr_customization_option" + - " WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrRacesID, Sex, ChrModelID, SortIndex, " + + "ChrCustomizationCategoryID, OptionType, BarberShopCostModifier, ChrCustomizationID, ChrCustomizationReqID, UiOrderIndex, AddedInPatch" + + " FROM chr_customization_option WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION_LOCALE, "SELECT ID, Name_lang FROM chr_customization_option_locale" + " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); @@ -376,8 +379,9 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, SizeClass, CreatureModelScale, CreatureModelAlpha, BloodID, " + "ExtendedDisplayInfoID, NPCSoundID, ParticleColorID, PortraitCreatureDisplayInfoID, PortraitTextureFileDataID, ObjectEffectPackageID, " + "AnimReplacementSetID, Flags, StateSpellVisualKitID, PlayerOverrideScale, PetInstanceScale, UnarmedWeaponType, MountPoofSpellVisualKitID, " + - "DissolveEffectID, Gender, DissolveOutEffectID, CreatureModelMinLod, TextureVariationFileDataID1, TextureVariationFileDataID2, " + - "TextureVariationFileDataID3, TextureVariationFileDataID4 FROM creature_display_info WHERE (`VerifiedBuild` > 0) = ?"); + "DissolveEffectID, Gender, DissolveOutEffectID, CreatureModelMinLod, ConditionalCreatureModelID, Unknown_1100_1, Unknown_1100_2, " + + "TextureVariationFileDataID1, TextureVariationFileDataID2, TextureVariationFileDataID3, TextureVariationFileDataID4 FROM creature_display_info" + + " WHERE (`VerifiedBuild` > 0) = ?"); // CreatureDisplayInfoExtra.db2 PrepareStatement(HotfixStatements.SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, Flags, BakeMaterialResourcesID, " + @@ -393,8 +397,8 @@ namespace Framework.Database "RunSpeed, BloodID, FootprintTextureID, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, FoleyMaterialID, " + "FootstepCameraEffectID, DeathThudCameraEffectID, SoundID, SizeClass, CollisionWidth, CollisionHeight, WorldEffectScale, " + "CreatureGeosetDataID, HoverHeight, AttachedEffectScale, ModelScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, " + - "MountHeight, OverrideLootEffectScale, OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, Unknown820_1, Unknown820_2, " + - "Unknown820_31, Unknown820_32 FROM creature_model_data WHERE (`VerifiedBuild` > 0) = ?"); + "MountHeight, OverrideLootEffectScale, OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale, MountScaleOtherIndex, MountScaleSelf, " + + "Unknown1100, MountScaleOther1, MountScaleOther2 FROM creature_model_data WHERE (`VerifiedBuild` > 0) = ?"); // CreatureType.db2 PrepareStatement(HotfixStatements.SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type WHERE (`VerifiedBuild` > 0) = ?"); @@ -419,7 +423,7 @@ namespace Framework.Database // CurrencyTypes.db2 PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + "MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, " + - "RechargingAmountPerCycle, RechargingCycleDurationMS, Flags1, Flags2 FROM currency_types WHERE (`VerifiedBuild` > 0) = ?"); + "RechargingAmountPerCycle, RechargingCycleDurationMS, AccountTransferPercentage, Flags1, Flags2 FROM currency_types WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?"); @@ -514,12 +518,12 @@ namespace Framework.Database // GameobjectDisplayInfo.db2 PrepareStatement(HotfixStatements.SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, GeoBoxMaxZ, " + "FileDataID, ObjectEffectPackageID, OverrideLootEffectScale, OverrideNameScale, AlternateDisplayType, ClientCreatureDisplayInfoID, " + - "ClientItemID FROM gameobject_display_info WHERE (`VerifiedBuild` > 0) = ?"); + "ClientItemID, Unknown1100 FROM gameobject_display_info WHERE (`VerifiedBuild` > 0) = ?"); // Gameobjects.db2 PrepareStatement(HotfixStatements.SEL_GAMEOBJECTS, "SELECT Name, PosX, PosY, PosZ, Rot1, Rot2, Rot3, Rot4, ID, OwnerID, DisplayID, Scale, TypeID, " + - "PhaseUseFlags, PhaseID, PhaseGroupID, PropValue1, PropValue2, PropValue3, PropValue4, PropValue5, PropValue6, PropValue7, PropValue8" + - " FROM gameobjects WHERE (`VerifiedBuild` > 0) = ?"); + "PhaseUseFlags, PhaseID, PhaseGroupID, Unknown1100, PropValue1, PropValue2, PropValue3, PropValue4, PropValue5, PropValue6, PropValue7, " + + "PropValue8 FROM gameobjects WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_GAMEOBJECTS_LOCALE, "SELECT ID, Name_lang FROM gameobjects_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // GarrAbility.db2 @@ -787,7 +791,7 @@ namespace Framework.Database // ItemSearchName.db2 PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT ID, AllowableRace, Display, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " + - "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" + + "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4, Flags5" + " FROM item_search_name WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE, "SELECT ID, Display_lang FROM item_search_name_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?"); @@ -808,14 +812,14 @@ namespace Framework.Database "StatPercentageOfSocket2, StatPercentageOfSocket3, StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, " + "StatPercentageOfSocket7, StatPercentageOfSocket8, StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, " + "StatPercentEditor3, StatPercentEditor4, StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, " + - "StatPercentEditor10, Stackable, MaxCount, MinReputation, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, " + - "PriceRandomValue, Flags1, Flags2, Flags3, Flags4, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, " + - "PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, GemProperties, SocketMatchEnchantmentId, " + - "TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, " + - "ItemLevel, AllowableClass, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, " + - "PageMaterialID, Bonding, DamageDamageType, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, " + - "StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, " + - "StatModifierBonusStat10, ContainerSlots, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse" + + "StatPercentEditor10, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, " + + "StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, Stackable, " + + "MaxCount, MinReputation, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, " + + "Flags4, Flags5, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " + + "RequiredTransmogHoliday, RequiredHoliday, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, " + + "ItemSet, LockID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ArtifactID, SpellWeight, " + + "SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, Bonding, DamageDamageType, " + + "ContainerSlots, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse" + " WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" + " FROM item_sparse_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); @@ -853,7 +857,7 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // JournalTier.db2 - PrepareStatement(HotfixStatements.SEL_JOURNAL_TIER, "SELECT ID, Name, PlayerConditionID FROM journal_tier WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_JOURNAL_TIER, "SELECT ID, Name, Expansion, PlayerConditionID FROM journal_tier WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_JOURNAL_TIER_LOCALE, "SELECT ID, Name_lang FROM journal_tier_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // Keychain.db2 @@ -910,8 +914,8 @@ namespace Framework.Database // 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, NavigationMaxDistance, Flags1, Flags2, " + - "Flags3 FROM map WHERE (`VerifiedBuild` > 0) = ?"); + "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, NavigationMaxDistance, " + + "PreloadFileDataID, Flags1, Flags2, Flags3 FROM map WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " + "PvpLongDescription_lang FROM map_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); @@ -955,7 +959,7 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ?"); // MountXDisplay.db2 - PrepareStatement(HotfixStatements.SEL_MOUNT_X_DISPLAY, "SELECT ID, CreatureDisplayInfoID, PlayerConditionID, MountID FROM mount_x_display" + + PrepareStatement(HotfixStatements.SEL_MOUNT_X_DISPLAY, "SELECT ID, CreatureDisplayInfoID, PlayerConditionID, Unknown1100, MountID FROM mount_x_display" + " WHERE (`VerifiedBuild` > 0) = ?"); // Movie.db2 @@ -963,8 +967,8 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ?"); // MythicPlusSeason.db2 - PrepareStatement(HotfixStatements.SEL_MYTHIC_PLUS_SEASON, "SELECT ID, MilestoneSeason, ExpansionLevel, HeroicLFGDungeonMinGear FROM mythic_plus_season" + - " WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_MYTHIC_PLUS_SEASON, "SELECT ID, MilestoneSeason, StartTimeEvent, ExpansionLevel, HeroicLFGDungeonMinGear" + + " FROM mythic_plus_season WHERE (`VerifiedBuild` > 0) = ?"); // NameGen.db2 PrepareStatement(HotfixStatements.SEL_NAME_GEN, "SELECT ID, Name, RaceID, Sex FROM name_gen WHERE (`VerifiedBuild` > 0) = ?"); @@ -1127,7 +1131,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_SCENARIO_LOCALE, "SELECT ID, Name_lang FROM scenario_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // ScenarioStep.db2 - PrepareStatement(HotfixStatements.SEL_SCENARIO_STEP, "SELECT ID, Description, Title, ScenarioID, Criteriatreeid, RewardQuestID, RelatedStep, Supersedes, " + + PrepareStatement(HotfixStatements.SEL_SCENARIO_STEP, "SELECT Description, Title, ID, ScenarioID, Criteriatreeid, RewardQuestID, RelatedStep, Supersedes, " + "OrderIndex, Flags, VisibilityPlayerConditionID, WidgetSetID FROM scenario_step WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_SCENARIO_STEP_LOCALE, "SELECT ID, Description_lang, Title_lang FROM scenario_step_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?"); @@ -1254,10 +1258,10 @@ namespace Framework.Database "ChannelInterruptFlags1, ChannelInterruptFlags2, SpellID FROM spell_interrupts WHERE (`VerifiedBuild` > 0) = ?"); // SpellItemEnchantment.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, Duration, EffectArg1, EffectArg2, EffectArg3, " + + PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, Duration, EffectArg1, EffectArg2, EffectArg3, Flags, " + "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" + + "TransmogCost, EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, " + + "Effect1, Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment" + " WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT_LOCALE, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale" + " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); @@ -1286,8 +1290,8 @@ namespace Framework.Database // SpellMisc.db2 PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " + "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" + + "CastingTimeIndex, DurationIndex, PvPDurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, " + + "ActiveIconFileDataID, ContentTuningID, ShowFutureSpellPlayerConditionID, SpellVisualScript, ActiveSpellVisualScript, SpellID FROM spell_misc" + " WHERE (`VerifiedBuild` > 0) = ?"); // SpellName.db2 @@ -1363,19 +1367,19 @@ namespace Framework.Database // SpellVisualEffectName.db2 PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_EFFECT_NAME, "SELECT ID, ModelFileDataID, BaseMissileSpeed, Scale, MinAllowedScale, MaxAllowedScale, " + - "Alpha, Flags, TextureFileDataID, EffectRadius, Type, GenericID, RibbonQualityID, DissolveEffectID, ModelPosition, Unknown901" + + "Alpha, Flags, TextureFileDataID, EffectRadius, Type, GenericID, RibbonQualityID, DissolveEffectID, ModelPosition, Unknown901, Unknown1100" + " FROM spell_visual_effect_name WHERE (`VerifiedBuild` > 0) = ?"); + // SpellVisualKit.db2 + PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_KIT, "SELECT ID, ClutterLevel, FallbackSpellVisualKitId, DelayMin, DelayMax, Flags1, Flags2" + + " FROM spell_visual_kit WHERE (`VerifiedBuild` > 0) = ?"); + // SpellVisualMissile.db2 PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_MISSILE, "SELECT CastOffset1, CastOffset2, CastOffset3, ImpactOffset1, ImpactOffset2, ImpactOffset3, ID, " + "SpellVisualEffectNameID, SoundEntriesID, Attachment, DestinationAttachment, CastPositionerID, ImpactPositionerID, FollowGroundHeight, " + - "FollowGroundDropSpeed, FollowGroundApproach, Flags, SpellMissileMotionID, AnimKitID, ClutterLevel, DecayTimeAfterImpact, " + + "FollowGroundDropSpeed, FollowGroundApproach, Flags, SpellMissileMotionID, AnimKitID, ClutterLevel, DecayTimeAfterImpact, Unused1100, " + "SpellVisualMissileSetID FROM spell_visual_missile WHERE (`VerifiedBuild` > 0) = ?"); - // SpellVisualKit.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_KIT, "SELECT ID, FallbackPriority, FallbackSpellVisualKitId, DelayMin, DelayMax, Flags1, Flags2" + - " FROM spell_visual_kit WHERE (`VerifiedBuild` > 0) = ?"); - // SpellXSpellVisual.db2 PrepareStatement(HotfixStatements.SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " + "ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" + @@ -1421,8 +1425,8 @@ namespace Framework.Database // TraitCond.db2 PrepareStatement(HotfixStatements.SEL_TRAIT_COND, "SELECT ID, CondType, TraitTreeID, GrantedRanks, QuestID, AchievementID, SpecSetID, TraitNodeGroupID, " + - "TraitNodeID, TraitCurrencyID, SpentAmountRequired, Flags, RequiredLevel, FreeSharedStringID, SpendMoreSharedStringID FROM trait_cond" + - " WHERE (`VerifiedBuild` > 0) = ?"); + "TraitNodeID, TraitCurrencyID, SpentAmountRequired, Flags, RequiredLevel, FreeSharedStringID, SpendMoreSharedStringID, " + + "TraitCondAccountElementID FROM trait_cond WHERE (`VerifiedBuild` > 0) = ?"); // TraitCost.db2 PrepareStatement(HotfixStatements.SEL_TRAIT_COST, "SELECT InternalName, ID, Amount, TraitCurrencyID FROM trait_cost WHERE (`VerifiedBuild` > 0) = ?"); @@ -1451,10 +1455,11 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ?"); // TraitNode.db2 - PrepareStatement(HotfixStatements.SEL_TRAIT_NODE, "SELECT ID, TraitTreeID, PosX, PosY, Type, Flags FROM trait_node WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_TRAIT_NODE, "SELECT ID, TraitTreeID, PosX, PosY, Type, Flags, TraitSubTreeID FROM trait_node" + + " WHERE (`VerifiedBuild` > 0) = ?"); // TraitNodeEntry.db2 - PrepareStatement(HotfixStatements.SEL_TRAIT_NODE_ENTRY, "SELECT ID, TraitDefinitionID, MaxRanks, NodeEntryType FROM trait_node_entry" + + PrepareStatement(HotfixStatements.SEL_TRAIT_NODE_ENTRY, "SELECT ID, TraitDefinitionID, MaxRanks, NodeEntryType, TraitSubTreeID FROM trait_node_entry" + " WHERE (`VerifiedBuild` > 0) = ?"); // TraitNodeEntryXTraitCond.db2 @@ -1540,8 +1545,8 @@ namespace Framework.Database // UiMap.db2 PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, `System`, Type, BountySetID, BountyDisplayLocation, " + - "VisibilityPlayerConditionID2, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup, ContentTuningID FROM ui_map" + - " WHERE (`VerifiedBuild` > 0) = ?"); + "VisibilityPlayerConditionID2, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup, ContentTuningID, " + + "AdventureMapTextureKitID FROM ui_map WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_UI_MAP_LOCALE, "SELECT ID, Name_lang FROM ui_map_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // UiMapAssignment.db2 @@ -1722,6 +1727,8 @@ namespace Framework.Database SEL_BATTLEMASTER_LIST, SEL_BATTLEMASTER_LIST_LOCALE, + SEL_BATTLEMASTER_LIST_X_MAP, + SEL_BROADCAST_TEXT, SEL_BROADCAST_TEXT_LOCALE, @@ -2277,10 +2284,10 @@ namespace Framework.Database SEL_SPELL_VISUAL_EFFECT_NAME, - SEL_SPELL_VISUAL_MISSILE, - SEL_SPELL_VISUAL_KIT, + SEL_SPELL_VISUAL_MISSILE, + SEL_SPELL_X_SPELL_VISUAL, SEL_SUMMON_PROPERTIES, diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 96ab573d8..fc10ed5a7 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -182,6 +182,7 @@ namespace Game.Achievements case CriteriaType.HighestHealReceived: case CriteriaType.AnyArtifactPowerRankPurchased: case CriteriaType.AzeriteLevelReached: + case CriteriaType.ReachRenownLevel: SetCriteriaProgress(criteria, miscValue1, referencePlayer, ProgressType.Highest); break; case CriteriaType.ReachLevel: @@ -3698,6 +3699,40 @@ namespace Game.Achievements return false; break; } + case ModifierTreeType.PlayerHasActiveTraitSubTree: // 385 + { + int traitConfigWithSubtree = referencePlayer.m_activePlayerData.TraitConfigs.FindIndexIf(traitConfig => + { + if (traitConfig.Type == (int)TraitConfigType.Combat + && (referencePlayer.m_activePlayerData.ActiveCombatTraitConfigID != traitConfig.ID + || !traitConfig.CombatConfigFlags.GetValue().HasAnyFlag((int)TraitCombatConfigFlags.ActiveForSpec))) + return false; + + return traitConfig.SubTrees.FindIndexIf(traitSubTree => + { + return traitSubTree.TraitSubTreeID == reqValue && traitSubTree.Active != 0; + }) >= 0; + }); + if (traitConfigWithSubtree < 0) + return false; + break; + } + case ModifierTreeType.TargetCreatureClassificationEqual: // 389 + { + Creature targetCreature = refe?.ToCreature(); + if (targetCreature == null) + return false; + if (targetCreature.GetCreatureClassification() != (CreatureClassifications)reqValue) + return false; + break; + } + case ModifierTreeType.PlayerHasCompletedQuestOrIsReadyToTurnIn: // 392 + { + QuestStatus status = referencePlayer.GetQuestStatus(reqValue); + if (status != QuestStatus.Complete && status != QuestStatus.Rewarded) + return false; + break; + } default: return false; } diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index b9b757e20..5bac86c52 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -1256,7 +1256,7 @@ namespace Game.BattleGrounds public uint GetMapId() { - return (uint)_battlegroundTemplate.BattlemasterEntry.MapId[0]; + return (uint)_battlegroundTemplate.MapIDs[0]; } public void SetBgMap(BattlegroundMap map) diff --git a/Source/Game/BattleGrounds/BattleGroundManager.cs b/Source/Game/BattleGrounds/BattleGroundManager.cs index f6615293b..3b1cbb31e 100644 --- a/Source/Game/BattleGrounds/BattleGroundManager.cs +++ b/Source/Game/BattleGrounds/BattleGroundManager.cs @@ -290,10 +290,10 @@ namespace Game.BattleGrounds if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA || bgTypeId == BattlegroundTypeId.RandomEpic) return null; - PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketById((uint)bg_template.BattlemasterEntry.MapId[0], bracketId); + PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketById((uint)bg_template.MapIDs[0], bracketId); if (bracketEntry == null) { - Log.outError(LogFilter.Battleground, $"Battleground: CreateNewBattleground: bg bracket entry not found for map {bg_template.BattlemasterEntry.MapId[0]} bracket id {bracketId}"); + Log.outError(LogFilter.Battleground, $"Battleground: CreateNewBattleground: bg bracket entry not found for map {bg_template.MapIDs[0]} bracket id {bracketId}"); return null; } @@ -328,6 +328,11 @@ namespace Game.BattleGrounds return; } + MultiMap mapsByBattleground = new(); + foreach (var (_, battlemasterListXMap) in CliDB.BattlemasterListXMapStorage) + if (CliDB.BattlemasterListStorage.HasRecord(battlemasterListXMap.BattlemasterListID) && CliDB.MapStorage.HasRecord((uint)battlemasterListXMap.MapID)) + mapsByBattleground.Add((BattlegroundTypeId)battlemasterListXMap.BattlemasterListID, battlemasterListXMap.MapID); + uint count = 0; do { @@ -351,6 +356,7 @@ namespace Game.BattleGrounds bgTemplate.ScriptId = Global.ObjectMgr.GetScriptId(result.Read(5)); bgTemplate.BattlemasterEntry = bl; + bgTemplate.MapIDs = mapsByBattleground[bgTypeId]; if (bgTemplate.Id != BattlegroundTypeId.AA && !IsRandomBattleground(bgTemplate.Id)) { @@ -381,8 +387,8 @@ namespace Game.BattleGrounds _battlegroundTemplates[bgTypeId] = bgTemplate; - if (bgTemplate.BattlemasterEntry.MapId[1] == -1) // in this case we have only one mapId - _battlegroundMapTemplates[(uint)bgTemplate.BattlemasterEntry.MapId[0]] = _battlegroundTemplates[bgTypeId]; + if (bgTemplate.MapIDs.Count == 1) + _battlegroundMapTemplates[(uint)bgTemplate.MapIDs[0]] = _battlegroundTemplates[bgTypeId]; ++count; } @@ -641,11 +647,8 @@ namespace Game.BattleGrounds { Dictionary selectionWeights = new(); - foreach (var mapId in bgTemplate.BattlemasterEntry.MapId) + foreach (var mapId in bgTemplate.MapIDs) { - if (mapId == -1) - break; - BattlegroundTemplate bg = GetBattlegroundTemplateByMapId((uint)mapId); if (bg != null) { @@ -788,6 +791,7 @@ namespace Game.BattleGrounds public byte Weight; public uint ScriptId; public BattlemasterListRecord BattlemasterEntry; + public List MapIDs = new(); public bool IsArena() { return BattlemasterEntry.InstanceType == (uint)MapTypes.Arena; } diff --git a/Source/Game/BattleGrounds/BattleGroundQueue.cs b/Source/Game/BattleGrounds/BattleGroundQueue.cs index b59132773..9f163bad6 100644 --- a/Source/Game/BattleGrounds/BattleGroundQueue.cs +++ b/Source/Game/BattleGrounds/BattleGroundQueue.cs @@ -731,11 +731,8 @@ namespace Game.BattleGrounds } // loop over queues for every map - foreach (var mapId in bg_template.BattlemasterEntry.MapId) + foreach (var mapId in bg_template.MapIDs) { - if (mapId == -1) - break; - var bgQueues = Global.BattlegroundMgr.GetBGFreeSlotQueueStore((uint)mapId); foreach (var bg in bgQueues) { diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 6ecf5c1ea..a034e726c 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -91,6 +91,7 @@ namespace Game.DataStorage BattlePetSpeciesStorage = ReadDB2("BattlePetSpecies.db2", HotfixStatements.SEL_BATTLE_PET_SPECIES, HotfixStatements.SEL_BATTLE_PET_SPECIES_LOCALE); BattlePetSpeciesStateStorage = ReadDB2("BattlePetSpeciesState.db2", HotfixStatements.SEL_BATTLE_PET_SPECIES_STATE); BattlemasterListStorage = ReadDB2("BattlemasterList.db2", HotfixStatements.SEL_BATTLEMASTER_LIST, HotfixStatements.SEL_BATTLEMASTER_LIST_LOCALE); + BattlemasterListXMapStorage = ReadDB2("BattlemasterListXMap.db2", HotfixStatements.SEL_BATTLEMASTER_LIST_X_MAP); BroadcastTextStorage = ReadDB2("BroadcastText.db2", HotfixStatements.SEL_BROADCAST_TEXT, HotfixStatements.SEL_BROADCAST_TEXT_LOCALE); BroadcastTextDurationStorage = ReadDB2("BroadcastTextDuration.db2", HotfixStatements.SEL_BROADCAST_TEXT_DURATION); CfgCategoriesStorage = ReadDB2("Cfg_Categories.db2", HotfixStatements.SEL_CFG_CATEGORIES, HotfixStatements.SEL_CFG_CATEGORIES_LOCALE); @@ -536,6 +537,7 @@ namespace Game.DataStorage public static DB6Storage BattlePetSpeciesStorage; public static DB6Storage BattlePetSpeciesStateStorage; public static DB6Storage BattlemasterListStorage; + public static DB6Storage BattlemasterListXMapStorage; public static DB6Storage BroadcastTextStorage; public static DB6Storage BroadcastTextDurationStorage; public static DB6Storage CfgCategoriesStorage; diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index aacd1a066..5100b403b 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -892,7 +892,9 @@ namespace Game.DataStorage public uint GetEmptyAnimStateID() { - return AnimationDataStorage.GetNumRows(); + return 1778; + // TEMP: well... AnimationData.db2 in 11.0.0 has more rows than max hardcoded anim id in client + //return AnimationDataStorage.GetNumRows(); } public List GetAreasForGroup(uint areaGroupId) diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs index 86452ef6b..b3ae99ba3 100644 --- a/Source/Game/DataStorage/Structs/A_Records.cs +++ b/Source/Game/DataStorage/Structs/A_Records.cs @@ -85,7 +85,7 @@ namespace Game.DataStorage public uint Id; public ushort Fallback; public byte BehaviorTier; - public int BehaviorID; + public short BehaviorID; public int[] Flags = new int[2]; } diff --git a/Source/Game/DataStorage/Structs/B_Records.cs b/Source/Game/DataStorage/Structs/B_Records.cs index 009c2b6ae..2e29daf91 100644 --- a/Source/Game/DataStorage/Structs/B_Records.cs +++ b/Source/Game/DataStorage/Structs/B_Records.cs @@ -92,11 +92,17 @@ namespace Game.DataStorage public int Flags; public int IconFileDataID; public int RequiredPlayerConditionID; - public short[] MapId = new short[16]; public bool HasFlag(BattlemasterListFlags battlemasterListFlags) { return (Flags & (int)battlemasterListFlags) != 0; } } + public sealed class BattlemasterListXMapRecord + { + public uint ID; + public int MapID; + public uint BattlemasterListID; + } + public sealed class BroadcastTextRecord { public LocalizedString Text; diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index a818adaf4..83b0728d6 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -36,10 +36,8 @@ namespace Game.DataStorage public uint Id; public int ItemBonusTreeGroupID; public int DstItemBonusTreeID; - public sbyte Type; public int Value; - public int MythicPlusSeasonID; - public int PvPSeasonID; + public int RequiredTimeEventPassed; public uint SrcItemBonusTreeID; } @@ -198,6 +196,8 @@ namespace Game.DataStorage public uint Id; public ushort SecondaryID; public int Flags; + public int ChrRacesID; + public int Sex; public uint ChrModelID; public int SortIndex; public int ChrCustomizationCategoryID; @@ -468,7 +468,7 @@ namespace Game.DataStorage public int PortraitTextureFileDataID; public ushort ObjectEffectPackageID; public ushort AnimReplacementSetID; - public byte Flags; + public int Flags; public int StateSpellVisualKitID; public float PlayerOverrideScale; public float PetInstanceScale; // scale of not own player pets inside dungeons/raids/scenarios @@ -478,6 +478,9 @@ namespace Game.DataStorage public sbyte Gender; public int DissolveOutEffectID; public sbyte CreatureModelMinLod; + public ushort ConditionalCreatureModelID; + public float Unknown_1100_1; + public ushort Unknown_1100_2; public int[] TextureVariationFileDataID = new int[4]; } @@ -510,7 +513,7 @@ namespace Game.DataStorage { public uint Id; public float[] GeoBox = new float[6]; - public uint Flags; + public int Flags; public uint FileDataID; public float WalkSpeed; public float RunSpeed; @@ -539,9 +542,10 @@ namespace Game.DataStorage public float OverrideNameScale; public float OverrideSelectionRadius; public float TamedPetBaseScale; - public sbyte Unknown820_1; // scale related - public float Unknown820_2; // scale related - public float[] Unknown820_3 = new float[2]; // scale related + public sbyte MountScaleOtherIndex; + public float MountScaleSelf; + public ushort Unknown1100; + public float[] MountScaleOther = new float[2]; public bool HasFlag(CreatureModelDataFlags creatureModelDataFlags) { return (Flags & (uint)creatureModelDataFlags) != 0; } } @@ -617,6 +621,7 @@ namespace Game.DataStorage public int MaxQtyWorldStateID; public uint RechargingAmountPerCycle; public uint RechargingCycleDurationMS; + public float AccountTransferPercentage; public int[] Flags = new int[2]; public bool HasFlag(CurrencyTypesFlags currencyTypesFlags) { return (Flags[0] & (int)currencyTypesFlags) != 0; } diff --git a/Source/Game/DataStorage/Structs/D_Records.cs b/Source/Game/DataStorage/Structs/D_Records.cs index 6b982b9f2..eec24d36a 100644 --- a/Source/Game/DataStorage/Structs/D_Records.cs +++ b/Source/Game/DataStorage/Structs/D_Records.cs @@ -43,7 +43,7 @@ namespace Game.DataStorage public byte MinPlayers; public byte MaxPlayers; public ushort Flags; - public byte ItemContext; + public sbyte ItemContext; public byte ToggleDifficultyID; public uint GroupSizeHealthCurveID; public uint GroupSizeDmgCurveID; diff --git a/Source/Game/DataStorage/Structs/E_Records.cs b/Source/Game/DataStorage/Structs/E_Records.cs index cc6cdda64..0d4fc6a3b 100644 --- a/Source/Game/DataStorage/Structs/E_Records.cs +++ b/Source/Game/DataStorage/Structs/E_Records.cs @@ -8,9 +8,9 @@ namespace Game.DataStorage public uint Id; public long RaceMask; public string EmoteSlashCommand; - public int AnimId; - public uint EmoteFlags; - public byte EmoteSpecProc; + public short AnimID; + public int EmoteFlags; + public int EmoteSpecProc; public uint EmoteSpecProcParam; public uint EventSoundID; public uint SpellVisualKitId; diff --git a/Source/Game/DataStorage/Structs/F_Records.cs b/Source/Game/DataStorage/Structs/F_Records.cs index 387f7aad2..1ebabb7c8 100644 --- a/Source/Game/DataStorage/Structs/F_Records.cs +++ b/Source/Game/DataStorage/Structs/F_Records.cs @@ -39,7 +39,7 @@ namespace Game.DataStorage public uint Id; public ushort Faction; - public ushort Flags; + public int Flags; public byte FactionGroup; public byte FriendGroup; public byte EnemyGroup; diff --git a/Source/Game/DataStorage/Structs/G_Records.cs b/Source/Game/DataStorage/Structs/G_Records.cs index 5d483dcc0..aefeb3f71 100644 --- a/Source/Game/DataStorage/Structs/G_Records.cs +++ b/Source/Game/DataStorage/Structs/G_Records.cs @@ -24,6 +24,7 @@ namespace Game.DataStorage public int AlternateDisplayType; public int ClientCreatureDisplayInfoID; public int ClientItemID; + public ushort Unknown1100; public Vector3 GeoBoxMin { @@ -50,6 +51,7 @@ namespace Game.DataStorage public int PhaseUseFlags; public int PhaseID; public int PhaseGroupID; + public ushort Unknown1100; public int[] PropValue = new int[8]; } @@ -133,7 +135,7 @@ namespace Game.DataStorage public byte AllianceGarrFollRaceID; public uint HordeGarrClassSpecID; public uint AllianceGarrClassSpecID; - public sbyte Quality; + public int Quality; public byte FollowerLevel; public ushort ItemLevelWeapon; public ushort ItemLevelArmor; @@ -206,7 +208,7 @@ namespace Game.DataStorage { public uint Id; public string Name; - public byte PlotType; + public sbyte PlotType; public uint HordeConstructObjID; public uint AllianceConstructObjID; public byte Flags; @@ -293,7 +295,7 @@ namespace Game.DataStorage { public uint Id; public uint SpellID; - public byte GlyphType; + public sbyte GlyphType; public byte GlyphExclusiveCategoryID; public uint SpellIconID; } @@ -311,7 +313,7 @@ namespace Game.DataStorage public int GossipNpcOption; public int LFGDungeonsID; public int TrainerID; - public int GarrFollowerTypeID; + public sbyte GarrFollowerTypeID; public int CharShipmentID; public int GarrTalentTreeID; public int UiMapID; diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs index df5cb6c55..ccba85267 100644 --- a/Source/Game/DataStorage/Structs/I_Records.cs +++ b/Source/Game/DataStorage/Structs/I_Records.cs @@ -52,7 +52,7 @@ namespace Game.DataStorage public sealed class ItemAppearanceRecord { public uint Id; - public int DisplayType; + public sbyte DisplayType; public uint ItemDisplayInfoID; public int DefaultIconFileDataID; public int UiOrder; @@ -164,7 +164,7 @@ namespace Game.DataStorage public sealed class ItemContextPickerEntryRecord { public uint Id; - public byte ItemCreationContext; + public sbyte ItemCreationContext; public byte OrderIndex; public int PVal; public int LabelID; @@ -329,7 +329,7 @@ namespace Game.DataStorage public ushort RequiredSkillRank; public uint RequiredAbility; public ushort ItemLevel; - public int[] Flags = new int[4]; + public int[] Flags = new int[5]; } public sealed class ItemSetRecord @@ -373,6 +373,7 @@ namespace Game.DataStorage public float ItemRange; public float[] StatPercentageOfSocket = new float[ItemConst.MaxStats]; public int[] StatPercentEditor = new int[ItemConst.MaxStats]; + public int[] StatModifierBonusStat = new int[ItemConst.MaxStats]; public uint Stackable; public uint MaxCount; public uint MinReputation; @@ -382,7 +383,7 @@ namespace Game.DataStorage public uint VendorStackCount; public float PriceVariance; public float PriceRandomValue; - public int[] Flags = new int[4]; + public int[] Flags = new int[5]; public uint FactionRelated; public int ModifiedCraftingReagentItemID; public uint ContentTuningID; @@ -413,7 +414,6 @@ namespace Game.DataStorage public byte PageMaterialID; public byte Bonding; public byte DamageType; - public sbyte[] StatModifierBonusStat = new sbyte[ItemConst.MaxStats]; public byte ContainerSlots; public byte RequiredPVPMedal; public byte RequiredPVPRank; diff --git a/Source/Game/DataStorage/Structs/J_Records.cs b/Source/Game/DataStorage/Structs/J_Records.cs index 04ca5c5b5..d1bc68160 100644 --- a/Source/Game/DataStorage/Structs/J_Records.cs +++ b/Source/Game/DataStorage/Structs/J_Records.cs @@ -59,6 +59,7 @@ namespace Game.DataStorage { public uint Id; public LocalizedString Name; + public int Expansion; public int PlayerConditionID; } } diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs index 45c200ec2..c409333eb 100644 --- a/Source/Game/DataStorage/Structs/M_Records.cs +++ b/Source/Game/DataStorage/Structs/M_Records.cs @@ -38,6 +38,7 @@ namespace Game.DataStorage public int ZmpFileDataID; public int WdtFileDataID; public int NavigationMaxDistance; + public int PreloadFileDataID; public uint[] Flags = new uint[3]; // Helpers @@ -127,7 +128,7 @@ namespace Game.DataStorage public int LockID; public MapDifficultyResetInterval ResetInterval; public uint MaxPlayers; - public int ItemContext; + public byte ItemContext; public uint ItemContextPickerID; public int Flags; public int ContentTuningID; @@ -227,6 +228,7 @@ namespace Game.DataStorage public uint Id; public uint CreatureDisplayInfoID; public uint PlayerConditionID; + public ushort Unknown1100; public uint MountID; } @@ -244,6 +246,7 @@ namespace Game.DataStorage { public uint Id; public int MilestoneSeason; + public int StartTimeEvent; public int ExpansionLevel; public int HeroicLFGDungeonMinGear; } diff --git a/Source/Game/DataStorage/Structs/P_Records.cs b/Source/Game/DataStorage/Structs/P_Records.cs index abcda2b59..cdbbb6e3b 100644 --- a/Source/Game/DataStorage/Structs/P_Records.cs +++ b/Source/Game/DataStorage/Structs/P_Records.cs @@ -106,7 +106,7 @@ namespace Game.DataStorage public sbyte ChrSpecializationRole; public uint ModifierTreeID; public sbyte PowerType; - public byte PowerTypeComp; + public sbyte PowerTypeComp; public byte PowerTypeValue; public int WeaponSubclassMask; public byte MaxGuildLevel; @@ -151,7 +151,7 @@ namespace Game.DataStorage { public uint Id; public string GlobalStringBaseTag; - public byte ActualType; + public sbyte ActualType; public byte Red; public byte Green; public byte Blue; @@ -171,9 +171,9 @@ namespace Game.DataStorage public int RegenInterruptTimeMS; public float RegenPeace; public float RegenCombat; - public short Flags; + public int Flags; - public bool HasFlag(PowerTypeFlags powerTypeFlags) { return (Flags & (short)powerTypeFlags) != 0; } + public bool HasFlag(PowerTypeFlags powerTypeFlags) { return (Flags & (int)powerTypeFlags) != 0; } } public sealed class PrestigeLevelInfoRecord diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs index 9a8c2e600..0fdaf6993 100644 --- a/Source/Game/DataStorage/Structs/S_Records.cs +++ b/Source/Game/DataStorage/Structs/S_Records.cs @@ -19,9 +19,9 @@ namespace Game.DataStorage public sealed class ScenarioStepRecord { - public uint Id; public string Description; public string Title; + public uint Id; public ushort ScenarioID; public uint CriteriaTreeId; public uint RewardQuestID; @@ -88,7 +88,7 @@ namespace Game.DataStorage public sbyte CanLink; public uint ParentSkillLineID; public int ParentTierIndex; - public ushort Flags; + public int Flags; public int SpellBookSpellID; public int ExpansionNameSharedStringID; public int HordeExpansionNameSharedStringID; @@ -133,8 +133,8 @@ namespace Game.DataStorage public long RaceMask; public ushort SkillID; public int ClassMask; - public ushort Flags; - public sbyte Availability; + public int Flags; + public int Availability; public sbyte MinLevel; public ushort SkillTierID; @@ -374,6 +374,7 @@ namespace Game.DataStorage public string HordeName; public int Duration; public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects]; + public int Flags; public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects]; public uint IconFileDataID; public int MinItemLevel; @@ -382,7 +383,6 @@ namespace Game.DataStorage public uint TransmogCost; public ushort[] EffectPointsMin = new ushort[ItemConst.MaxItemEnchantmentEffects]; public ushort ItemVisual; - public ushort Flags; public ushort RequiredSkillID; public ushort RequiredSkillRank; public ushort ItemLevel; @@ -450,6 +450,7 @@ namespace Game.DataStorage public byte DifficultyID; public ushort CastingTimeIndex; public ushort DurationIndex; + public ushort PvPDurationIndex; public ushort RangeIndex; public byte SchoolMask; public float Speed; @@ -647,6 +648,17 @@ namespace Game.DataStorage public int DissolveEffectID; public int ModelPosition; public sbyte Unknown901; + public ushort Unknown1100; + } + + public sealed class SpellVisualKitRecord + { + public uint ID; + public int ClutterLevel; + public int FallbackSpellVisualKitId; + public ushort DelayMin; + public ushort DelayMax; + public int[] Flags = new int[2]; } public sealed class SpellVisualMissileRecord @@ -666,21 +678,12 @@ namespace Game.DataStorage public uint Flags; public ushort SpellMissileMotionID; public uint AnimKitID; - public sbyte ClutterLevel; + public int ClutterLevel; public int DecayTimeAfterImpact; + public ushort Unused1100; public uint SpellVisualMissileSetID; } - public sealed class SpellVisualKitRecord - { - public uint Id; - public sbyte FallbackPriority; - public int FallbackSpellVisualKitId; - public ushort DelayMin; - public ushort DelayMax; - public int[] Flags = new int[2]; - } - public sealed class SpellXSpellVisualRecord { public uint Id; diff --git a/Source/Game/DataStorage/Structs/T_Records.cs b/Source/Game/DataStorage/Structs/T_Records.cs index b60666c37..2698e3d5e 100644 --- a/Source/Game/DataStorage/Structs/T_Records.cs +++ b/Source/Game/DataStorage/Structs/T_Records.cs @@ -125,6 +125,7 @@ namespace Game.DataStorage public int RequiredLevel; public int FreeSharedStringID; public int SpendMoreSharedStringID; + public int TraitCondAccountElementID; public TraitConditionType GetCondType() { return (TraitConditionType)CondType; } } @@ -199,8 +200,9 @@ namespace Game.DataStorage public int TraitTreeID; public int PosX; public int PosY; - public sbyte Type; + public byte Type; public int Flags; + public int TraitSubTreeID; public TraitNodeType GetNodeType() { return (TraitNodeType)Type; } } @@ -211,6 +213,7 @@ namespace Game.DataStorage public int TraitDefinitionID; public int MaxRanks; public byte NodeEntryType; + public int TraitSubTreeID; public TraitNodeEntryType GetNodeEntryType() { return (TraitNodeEntryType)NodeEntryType; } } @@ -219,7 +222,7 @@ namespace Game.DataStorage { public uint Id; public int TraitCondID; - public uint TraitNodeEntryID; + public int TraitNodeEntryID; } public sealed class TraitNodeEntryXTraitCostRecord @@ -342,15 +345,15 @@ namespace Game.DataStorage public string Name; public uint Id; public int ClassMask; - public uint TrackingQuestID; + public int TrackingQuestID; public int Flags; public uint TransmogSetGroupID; public int ItemNameDescriptionID; - public ushort ParentTransmogSetID; - public byte Unknown810; - public byte ExpansionID; + public int ParentTransmogSetID; + public int Unknown810; + public int ExpansionID; public int PatchID; - public short UiOrder; + public int UiOrder; public uint PlayerConditionID; } diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs index 8e597ea75..b8cbb0411 100644 --- a/Source/Game/DataStorage/Structs/U_Records.cs +++ b/Source/Game/DataStorage/Structs/U_Records.cs @@ -22,6 +22,7 @@ namespace Game.DataStorage public int BkgAtlasID; public int AlternateUiMapGroup; public int ContentTuningID; + public int AdventureMapTextureKitID; public bool HasFlag(UiMapFlag uiMapFlag) { return (Flags & (int)uiMapFlag) != 0; } } @@ -85,9 +86,9 @@ namespace Game.DataStorage public sealed class UnitConditionRecord { public uint Id; - public byte Flags; + public int Flags; public byte[] Variable = new byte[8]; - public sbyte[] Op = new sbyte[8]; + public byte[] Op = new byte[8]; public int[] Value = new int[8]; public bool HasFlag(UnitConditionFlags unitConditionFlags) { return (Flags & (byte)unitConditionFlags) != 0; } diff --git a/Source/Game/DataStorage/Structs/V_Records.cs b/Source/Game/DataStorage/Structs/V_Records.cs index 0fb685ca4..24073bd0c 100644 --- a/Source/Game/DataStorage/Structs/V_Records.cs +++ b/Source/Game/DataStorage/Structs/V_Records.cs @@ -40,7 +40,7 @@ namespace Game.DataStorage public int Flags; public int FlagsB; public int FlagsC; - public sbyte AttachmentID; + public int AttachmentID; public float EnterPreDelay; public float EnterSpeed; public float EnterGravity; @@ -48,12 +48,12 @@ namespace Game.DataStorage public float EnterMaxDuration; public float EnterMinArcHeight; public float EnterMaxArcHeight; - public int EnterAnimStart; - public int EnterAnimLoop; - public int RideAnimStart; - public int RideAnimLoop; - public int RideUpperAnimStart; - public int RideUpperAnimLoop; + public short EnterAnimStart; + public short EnterAnimLoop; + public short RideAnimStart; + public short RideAnimLoop; + public short RideUpperAnimStart; + public short RideUpperAnimLoop; public float ExitPreDelay; public float ExitSpeed; public float ExitGravity; @@ -61,9 +61,9 @@ namespace Game.DataStorage public float ExitMaxDuration; public float ExitMinArcHeight; public float ExitMaxArcHeight; - public int ExitAnimStart; - public int ExitAnimLoop; - public int ExitAnimEnd; + public short ExitAnimStart; + public short ExitAnimLoop; + public short ExitAnimEnd; public short VehicleEnterAnim; public sbyte VehicleEnterAnimBone; public short VehicleExitAnim; diff --git a/Source/Game/Entities/Item/ItemBonusManager.cs b/Source/Game/Entities/Item/ItemBonusManager.cs index 34de258ba..0cbc38f14 100644 --- a/Source/Game/Entities/Item/ItemBonusManager.cs +++ b/Source/Game/Entities/Item/ItemBonusManager.cs @@ -163,82 +163,35 @@ namespace Game.Entities public static uint GetBonusTreeIdOverride(uint itemBonusTreeId, ItemBonusGenerationParams generationParams) { - // TODO: configure seasons globally - var mythicPlusSeason = CliDB.MythicPlusSeasonStorage.LookupByKey(0); - if (mythicPlusSeason != null) + List passedTimeEvents = new(); // sorted by date TODO: configure globally + + if (!passedTimeEvents.Empty()) { int selectedLevel = -1; int selectedMilestoneSeason = -1; ChallengeModeItemBonusOverrideRecord selectedItemBonusOverride = null; foreach (var itemBonusOverride in _challengeModeItemBonusOverrides.LookupByKey(itemBonusTreeId)) { - if (itemBonusOverride.Type != 0) + if (generationParams.MythicPlusKeystoneLevel != 0 && itemBonusOverride.Value > generationParams.MythicPlusKeystoneLevel) continue; - if (itemBonusOverride.Value > generationParams.MythicPlusKeystoneLevel.GetValueOrDefault(-1)) + if (generationParams.PvpTier != 0 && itemBonusOverride.Value > generationParams.PvpTier) continue; - if (itemBonusOverride.MythicPlusSeasonID != 0) + if (itemBonusOverride.RequiredTimeEventPassed != 0) { - var overrideSeason = CliDB.MythicPlusSeasonStorage.LookupByKey(itemBonusOverride.MythicPlusSeasonID); - if (overrideSeason == null) - continue; + var overrideMilestoneSeason = passedTimeEvents.IndexOf(itemBonusOverride.RequiredTimeEventPassed); + if (overrideMilestoneSeason == -1) + continue; // season not started yet - if (mythicPlusSeason.MilestoneSeason < overrideSeason.MilestoneSeason) - continue; + if (selectedMilestoneSeason > overrideMilestoneSeason) + continue; // older season that what was selected - if (selectedMilestoneSeason > overrideSeason.MilestoneSeason) - continue; - - if (selectedMilestoneSeason == overrideSeason.MilestoneSeason) + if (selectedMilestoneSeason == overrideMilestoneSeason) if (selectedLevel > itemBonusOverride.Value) - continue; + continue; // lower level in current season than what was already found - selectedMilestoneSeason = overrideSeason.MilestoneSeason; - } - else if (selectedLevel > itemBonusOverride.Value) - continue; - - selectedLevel = itemBonusOverride.Value; - selectedItemBonusOverride = itemBonusOverride; - } - - if (selectedItemBonusOverride != null && selectedItemBonusOverride.DstItemBonusTreeID != 0) - itemBonusTreeId = (uint)selectedItemBonusOverride.DstItemBonusTreeID; - } - - // TODO: configure seasons globally - var pvpSeason = CliDB.PvpSeasonStorage.LookupByKey(0); - if (pvpSeason != null) - { - int selectedLevel = -1; - int selectedMilestoneSeason = -1; - ChallengeModeItemBonusOverrideRecord selectedItemBonusOverride = null; - foreach (var itemBonusOverride in _challengeModeItemBonusOverrides.LookupByKey(itemBonusTreeId)) - { - if (itemBonusOverride.Type != 1) - continue; - - if (itemBonusOverride.Value > generationParams.PvpTier.GetValueOrDefault(-1)) - continue; - - if (itemBonusOverride.PvPSeasonID != 0) - { - var overrideSeason = CliDB.PvpSeasonStorage.LookupByKey(itemBonusOverride.PvPSeasonID); - if (overrideSeason == null) - continue; - - if (pvpSeason.MilestoneSeason < overrideSeason.MilestoneSeason) - continue; - - if (selectedMilestoneSeason > overrideSeason.MilestoneSeason) - continue; - - if (selectedMilestoneSeason == overrideSeason.MilestoneSeason) - if (selectedLevel > itemBonusOverride.Value) - continue; - - selectedMilestoneSeason = overrideSeason.MilestoneSeason; + selectedMilestoneSeason = overrideMilestoneSeason; } else if (selectedLevel > itemBonusOverride.Value) continue; diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 6271ab435..953ea450e 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -1445,7 +1445,11 @@ namespace Game.Entities playerCurrency.EarnedQuantity += (uint)amount; if (!isGainOnRefund) + { UpdateCriteria(CriteriaType.CurrencyGained, id, (ulong)amount); + if (gainSource == CurrencyGainSource.RenownRepGain) + UpdateCriteria(CriteriaType.ReachRenownLevel, id, playerCurrency.Quantity); + } } CurrencyChanged(id, amount); @@ -6514,6 +6518,8 @@ namespace Game.Entities XP = Math.Max(minScaledXP, XP); } + XP += (uint)(XP * GetTotalAuraMultiplier(AuraType.ModExplorationExperience)); + GiveXP(XP, null); SendExplorationExperience(areaId, XP); } diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index fb0b04bfb..b5dc8f943 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -1294,7 +1294,10 @@ namespace Game.Entities // 30% damage blocked, double blocked amount if block is critical damageInfo.Blocked = MathFunctions.CalculatePct(damageInfo.Damage, damageInfo.Target.GetBlockPercent(GetLevel())); if (damageInfo.Target.IsBlockCritical()) + { damageInfo.Blocked *= 2; + damageInfo.Blocked *= (uint)GetTotalAuraMultiplier(AuraType.ModCriticalBlockAmount); + } damageInfo.OriginalDamage = damageInfo.Damage; damageInfo.Damage -= damageInfo.Blocked; diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index f835af9dd..c53a27621 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -293,6 +293,8 @@ namespace Game.Entities // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085) TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(AuraType.ModDamagePercentTaken, (uint)spellProto.GetSchoolMask()); + TakenTotalMod *= GetTotalAuraMultiplier(AuraType.ModDamageTakenByLabel, aurEff => spellProto.HasLabel((uint)aurEff.GetMiscValue())); + // From caster spells if (caster != null) { @@ -306,7 +308,7 @@ namespace Game.Entities return aurEff.GetCasterGUID() == caster.GetGUID() && aurEff.IsAffectingSpell(spellProto); }); - TakenTotalMod *= GetTotalAuraMultiplier(AuraType.ModDamageTakenFromCasterByLabel, aurEff => + TakenTotalMod *= GetTotalAuraMultiplier(AuraType.ModSpellDamageFromCasterByLabel, aurEff => { return aurEff.GetCasterGUID() == caster.GetGUID() && spellProto.HasLabel((uint)aurEff.GetMiscValue()); }); @@ -2182,7 +2184,10 @@ namespace Game.Entities // double blocked amount if block is critical float value = victim.GetBlockPercent(GetLevel()); if (victim.IsBlockCritical()) + { value *= 2; // double blocked percent + value *= GetTotalAuraMultiplier(AuraType.ModCriticalBlockAmount); + } damageInfo.blocked = (uint)MathFunctions.CalculatePct(damage, value); if (damage <= damageInfo.blocked) { diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 14c307abb..fdaccd54d 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -262,7 +262,7 @@ namespace Game.Entities var emotesEntry = CliDB.EmotesStorage.LookupByKey(emoteId); if (emotesEntry != null && spellVisualKitIds != null) - if (emotesEntry.AnimId == (uint)Anim.MountSpecial || emotesEntry.AnimId == (uint)Anim.MountSelfSpecial) + if (emotesEntry.AnimID == (uint)Anim.MountSpecial || emotesEntry.AnimID == (uint)Anim.MountSelfSpecial) packet.SpellVisualKitIDs.AddRange(spellVisualKitIds); packet.SequenceVariation = sequenceVariation; diff --git a/Source/Game/Garrisons/Garrisons.cs b/Source/Game/Garrisons/Garrisons.cs index fe17fa102..957185d3d 100644 --- a/Source/Game/Garrisons/Garrisons.cs +++ b/Source/Game/Garrisons/Garrisons.cs @@ -253,7 +253,7 @@ namespace Game.Garrisons Plot plotInfo = _plots[garrPlotInstanceId]; plotInfo.PacketInfo.GarrPlotInstanceID = garrPlotInstanceId; plotInfo.PacketInfo.PlotPos.Relocate(gameObject.Pos.X, gameObject.Pos.Y, gameObject.Pos.Z, 2 * (float)Math.Acos(gameObject.Rot[3])); - plotInfo.PacketInfo.PlotType = plot.PlotType; + plotInfo.PacketInfo.PlotType = (byte)plot.PlotType; plotInfo.Rotation = new Quaternion(gameObject.Rot[0], gameObject.Rot[1], gameObject.Rot[2], gameObject.Rot[3]); plotInfo.EmptyGameObjectId = gameObject.Id; plotInfo.GarrSiteLevelPlotInstId = plots[i].Id; diff --git a/Source/Game/Groups/Group.cs b/Source/Game/Groups/Group.cs index 07c701501..ba930220a 100644 --- a/Source/Game/Groups/Group.cs +++ b/Source/Game/Groups/Group.cs @@ -1187,7 +1187,7 @@ namespace Game.Groups if (reference == null) return GroupJoinBattlegroundResult.BattlegroundJoinFailed; - PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgOrTemplate.BattlemasterEntry.MapId[0], reference.GetLevel()); + PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgOrTemplate.MapIDs[0], reference.GetLevel()); if (bracketEntry == null) return GroupJoinBattlegroundResult.BattlegroundJoinFailed; diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index 791f0a95b..3d024887e 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -80,7 +80,7 @@ namespace Game return; // expected bracket entry - PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.BattlemasterEntry.MapId[0], GetPlayer().GetLevel()); + PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.MapIDs[0], GetPlayer().GetLevel()); if (bracketEntry == null) return; @@ -295,7 +295,7 @@ namespace Game return; } - uint mapId = (uint)bgTemplate.BattlemasterEntry.MapId[0]; + uint mapId = (uint)bgTemplate.MapIDs[0]; // BGTemplateId returns Battleground_AA when it is arena queue. // Do instance id search as there is no AA bg instances. @@ -469,7 +469,7 @@ namespace Game continue; // expected bracket entry - PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.BattlemasterEntry.MapId[0], _player.GetLevel()); + PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.MapIDs[0], _player.GetLevel()); if (bracketEntry == null) continue; @@ -506,7 +506,7 @@ namespace Game BattlegroundTypeId bgTypeId = bgTemplate.Id; BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId((ushort)bgTypeId, BattlegroundQueueIdType.Arena, true, arenatype); - PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.BattlemasterEntry.MapId[0], _player.GetLevel()); + PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.MapIDs[0], _player.GetLevel()); if (bracketEntry == null) return; diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index a418a4799..0edaa0bdc 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -4743,6 +4743,24 @@ namespace Game.Spells new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Item), // 313 SPELL_EFFECT_CHANGE_ITEM_BONUSES_2 new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 314 SPELL_EFFECT_ADD_SOCKET_BONUS new StaticData(SpellEffectImplicitTargetTypes.Caster, SpellTargetObjectTypes.Unit), // 315 SPELL_EFFECT_LEARN_TRANSMOG_APPEARANCE_FROM_ITEM_MOD_APPEARANCE_GROUP + new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 316 SPELL_EFFECT_KILL_CREDIT_LABEL_1 + new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 317 SPELL_EFFECT_KILL_CREDIT_LABEL_2 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 318 SPELL_EFFECT_318 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 319 SPELL_EFFECT_319 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 320 SPELL_EFFECT_320 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 321 SPELL_EFFECT_321 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 322 SPELL_EFFECT_322 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 323 SPELL_EFFECT_323 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 324 SPELL_EFFECT_324 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 325 SPELL_EFFECT_325 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 326 SPELL_EFFECT_326 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 327 SPELL_EFFECT_327 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 328 SPELL_EFFECT_328 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 329 SPELL_EFFECT_329 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 330 SPELL_EFFECT_330 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 331 SPELL_EFFECT_331 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 332 SPELL_EFFECT_332 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 333 SPELL_EFFECT_333 }; #region Fields