Port to WoW client 12.0.7 (build 68453)

Adapt CypherCore from 11.2.5.63796 to 12.0.7.68453 using TrinityCore as
byte-exact reference.

- Fase 1: build gate 68453 (build_info + build_auth_key SQL, keys from TC)
- Fase 2: Opcodes.cs remapped by name to 12.0.7 values
- Fase 3: 32 DB2 structs + HotfixDatabase.cs SELECTs realigned; fixed
  ReputationManager/SpellInfo refs
- Fase 4: UpdateFields ported (GameObject/Conversation/AreaTrigger/Player/
  Unit/ActivePlayer + nested VisibleItem/QuestLog/BitVectors/CraftingOrderItem/
  SkillInfo)
- Critical protocol fixes: CreateObject header +3 bits (Room/Decor/MeshObject);
  EntityFragment enum renumbered to 12.0.7 (was 11.2.5 values, breaking every
  object packet)
- New-entity foundation: TypeId/TypeMask/HighGuid.MeshObject, fragment tags
- MeshObject entity scaffold (Midnight features are wire-format only)

Builds clean (dotnet build -c Release, 0 errors).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
adevopg
2026-07-12 19:44:16 +02:00
parent c968aa3c39
commit f58dbf7756
23 changed files with 5858 additions and 3106 deletions
File diff suppressed because it is too large Load Diff
+7 -2
View File
@@ -19,7 +19,8 @@ namespace Framework.Constants
AreaTrigger = 11,
SceneObject = 12,
Conversation = 13,
Max = 14
MeshObject = 14, // 12.0.7
Max = 15
}
public enum TypeMask
@@ -38,9 +39,10 @@ namespace Framework.Constants
AreaTrigger = 0x800,
SceneObject = 0x1000,
Conversation = 0x2000,
MeshObject = 0x4000, // 12.0.7
Seer = Unit | Player | DynamicObject,
WorldObject = Unit | GameObject | DynamicObject | Corpse | AreaTrigger | SceneObject | Conversation
WorldObject = Unit | GameObject | DynamicObject | Corpse | AreaTrigger | SceneObject | Conversation | MeshObject
}
public enum HighGuid
@@ -100,6 +102,9 @@ namespace Framework.Constants
ArenaTeam = 52,
LMMParty = 53,
LMMLobby = 54,
Housing = 55, // 12.0.7
MeshObject = 56, // 12.0.7
Entity = 57, // 12.0.7
Count
}
@@ -1,4 +1,4 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Framework.Database
@@ -202,9 +202,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// BattlemasterList.db2
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, PvpType, MinLevel, MaxLevel, " +
"RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID" +
" FROM battlemaster_list WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, PvpType, MinLevel, MaxLevel, 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 = ?");
@@ -246,8 +244,7 @@ namespace Framework.Database
" AND locale = ?");
// CharacterLoadout.db2
PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT, "SELECT ID, RaceMask, ChrClassID, Purpose, ItemContext FROM character_loadout" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT, "SELECT ID, ChrClassID, Purpose, ItemContext, RaceMask FROM character_loadout WHERE (`VerifiedBuild` > 0) = ?");
// CharacterLoadoutItem.db2
PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT_ITEM, "SELECT ID, CharacterLoadoutID, ItemID FROM character_loadout_item" +
@@ -305,8 +302,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// ChrCustomizationReq.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, RaceMask, ReqSource, Flags, ClassMask, RegionGroupMask, AchievementID, QuestID, " +
"OverrideArchive, ItemModifiedAppearanceID FROM chr_customization_req WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, ReqSource, Flags, ClassMask, RegionGroupMask, AchievementID, QuestID, OverrideArchive, ItemModifiedAppearanceID, RaceMask FROM chr_customization_req WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ_LOCALE, "SELECT ID, ReqSource_lang FROM chr_customization_req_locale WHERE (`VerifiedBuild` > 0) = ?" +
" AND locale = ?");
@@ -360,8 +356,7 @@ namespace Framework.Database
"ChrCustomizationCategoryID FROM conditional_chr_model WHERE (`VerifiedBuild` > 0) = ?");
// ConditionalContentTuning.db2
PrepareStatement(HotfixStatements.SEL_CONDITIONAL_CONTENT_TUNING, "SELECT ID, OrderIndex, RedirectContentTuningID, RedirectFlag, ParentContentTuningID" +
" FROM conditional_content_tuning WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CONDITIONAL_CONTENT_TUNING, "SELECT ID, OrderIndex, RedirectContentTuningID, RedirectFlag, RedirectEnum, ParentContentTuningID FROM conditional_content_tuning WHERE (`VerifiedBuild` > 0) = ?");
// ContentTuning.db2
PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, " +
@@ -434,9 +429,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// 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, AccountTransferPercentage, OrderIndex, Flags1, Flags2 FROM currency_types WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, RechargingAmountPerCycle, RechargingCycleDurationMS, AccountTransferPercentage, OrderIndex, RecraftReagentCountPercentage, OrderSource, MCRCurrencyID, 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 = ?");
@@ -478,8 +471,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_DURABILITY_QUALITY, "SELECT ID, Data FROM durability_quality WHERE (`VerifiedBuild` > 0) = ?");
// Emotes.db2
PrepareStatement(HotfixStatements.SEL_EMOTES, "SELECT ID, RaceMask, EmoteSlashCommand, AnimID, EmoteFlags, EmoteSpecProc, EmoteSpecProcParam, EventSoundID, " +
"SpellVisualKitID, ClassMask FROM emotes WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_EMOTES, "SELECT ID, EmoteSlashCommand, AnimID, EmoteFlags, EmoteSpecProc, EmoteSpecProcParam, EventSoundID, SpellVisualKitID, ClassMask, RaceMask FROM emotes WHERE (`VerifiedBuild` > 0) = ?");
// EmotesText.db2
PrepareStatement(HotfixStatements.SEL_EMOTES_TEXT, "SELECT ID, Name, EmoteID FROM emotes_text WHERE (`VerifiedBuild` > 0) = ?");
@@ -499,12 +491,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// Faction.db2
PrepareStatement(HotfixStatements.SEL_FACTION, "SELECT ID, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, " +
"Description, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, RenownFactionID, RenownCurrencyID, " +
"ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, " +
"ReputationFlags3, ReputationFlags4, ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, " +
"ReputationMax3, ReputationMax4, ParentFactionMod1, ParentFactionMod2, ParentFactionCap1, ParentFactionCap2 FROM faction" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_FACTION, "SELECT ID, Name, Description, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, RenownFactionID, RenownCurrencyID, ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, ParentFactionMod1, ParentFactionMod2, ParentFactionCap1, ParentFactionCap2, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4 FROM faction WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_FACTION_LOCALE, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// FactionTemplate.db2
@@ -597,8 +584,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// GarrPlot.db2
PrepareStatement(HotfixStatements.SEL_GARR_PLOT, "SELECT ID, Name, PlotType, HordeConstructObjID, AllianceConstructObjID, Flags, UiCategoryID, " +
"UpgradeRequirement1, UpgradeRequirement2 FROM garr_plot WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_GARR_PLOT, "SELECT ID, Name, PlotType, HordeConstructObjID, AllianceConstructObjID, Flags, UpgradeRequirement1, UpgradeRequirement2 FROM garr_plot WHERE (`VerifiedBuild` > 0) = ?");
// GarrPlotBuilding.db2
PrepareStatement(HotfixStatements.SEL_GARR_PLOT_BUILDING, "SELECT ID, GarrPlotID, GarrBuildingID FROM garr_plot_building WHERE (`VerifiedBuild` > 0) = ?");
@@ -640,7 +626,7 @@ namespace Framework.Database
// GossipNpcOption.db2
PrepareStatement(HotfixStatements.SEL_GOSSIP_NPC_OPTION, "SELECT ID, GossipNpcOption, LFGDungeonsID, TrainerID, GarrFollowerTypeID, CharShipmentID, " +
"GarrTalentTreeID, UiMapID, UiItemInteractionID, Unknown_1000_8, Unknown_1000_9, CovenantID, GossipOptionID, TraitTreeID, ProfessionID, " +
"Unknown_1002_14, SkillLineID FROM gossip_npc_option WHERE (`VerifiedBuild` > 0) = ?");
"Unknown_1002_14, NeighborhoodMapID, SkillLineID FROM gossip_npc_option WHERE (`VerifiedBuild` > 0) = ?");
// GuildColorBackground.db2
PrepareStatement(HotfixStatements.SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Blue, Green FROM guild_color_background WHERE (`VerifiedBuild` > 0) = ?");
@@ -683,8 +669,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Data FROM import_price_weapon WHERE (`VerifiedBuild` > 0) = ?");
// Item.db2
PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " +
"ItemGroupSoundsID, ContentTuningID, ModifiedCraftingReagentItemID, CraftingQualityID FROM item WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, ItemGroupSoundsID, ContentTuningID, ModifiedCraftingReagentItemID, Unknown1200, CraftingQualityID, ItemSquishEraID, RecraftReagentCountPercentage, OrderSource FROM item WHERE (`VerifiedBuild` > 0) = ?");
// ItemAppearance.db2
PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder, PlayerConditionID" +
@@ -770,14 +755,10 @@ namespace Framework.Database
" FROM item_disenchant_loot WHERE (`VerifiedBuild` > 0) = ?");
// ItemEffect.db2
PrepareStatement(HotfixStatements.SEL_ITEM_EFFECT, "SELECT ID, LegacySlotIndex, TriggerType, Charges, CoolDownMSec, CategoryCoolDownMSec, SpellCategoryID, " +
"SpellID, ChrSpecializationID FROM item_effect WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_ITEM_EFFECT, "SELECT ID, LegacySlotIndex, TriggerType, Charges, CoolDownMSec, CategoryCoolDownMSec, SpellCategoryID, SpellID, ChrSpecializationID, PlayerConditionID FROM item_effect WHERE (`VerifiedBuild` > 0) = ?");
// ItemExtendedCost.db2
PrepareStatement(HotfixStatements.SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaRating, ArenaBracket, Flags, MinFactionID, MinReputation, " +
"RequiredAchievement, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemCount5, CurrencyID1, " +
"CurrencyID2, CurrencyID3, CurrencyID4, CurrencyID5, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, CurrencyCount5" +
" FROM item_extended_cost WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_ITEM_EXTENDED_COST, "SELECT ID, Money, RequiredArenaRating, ArenaBracket, Flags, MinFactionID, MinReputation, RequiredAchievement, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemCount5, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyID5, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, CurrencyCount5 FROM item_extended_cost WHERE (`VerifiedBuild` > 0) = ?");
// ItemLevelSelector.db2
PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, MinItemLevel, ItemLevelSelectorQualitySetID, AzeriteUnlockMappingSet" +
@@ -820,13 +801,10 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base WHERE (`VerifiedBuild` > 0) = ?");
// ItemScalingConfig.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SCALING_CONFIG, "SELECT ID, ItemOffsetCurveID, ItemLevel, RequiredLevel, Unknown1125 FROM item_scaling_config" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_ITEM_SCALING_CONFIG, "SELECT ID, ItemOffsetCurveID, ItemLevel, RequiredLevel, Unknown1125, Flags FROM item_scaling_config WHERE (`VerifiedBuild` > 0) = ?");
// 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, Flags5" +
" FROM item_search_name WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT ID, Display, OverallQualityID, ExpansionID, MinFactionID, MinReputation, AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4, Flags5, AllowableRace 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 = ?");
@@ -841,20 +819,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// ItemSparse.db2
PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, ExpansionID, DmgVariance, " +
"LimitCategory, DurationInInventory, QualityModifier, BagFamily, StartQuestID, LanguageID, ItemRange, StatPercentageOfSocket1, " +
"StatPercentageOfSocket2, StatPercentageOfSocket3, StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, " +
"StatPercentageOfSocket7, StatPercentageOfSocket8, StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, " +
"StatPercentEditor3, StatPercentEditor4, StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, " +
"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, ItemLevelOffsetCurveID, " +
"ItemLevelOffsetItemLevel, 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, "SELECT ID, Description, Display3, Display2, Display1, Display, ExpansionID, DmgVariance, LimitCategory, DurationInInventory, QualityModifier, BagFamily, StartQuestID, LanguageID, ItemRange, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, Stackable, MaxCount, MinReputation, RequiredAbility, AllowableRace, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, Flags5, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemLevelOffsetCurveID, ItemLevelOffsetItemLevel, ItemSquishEraID, 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, DamageType, 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 = ?");
@@ -927,12 +892,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// LiquidType.db2
PrepareStatement(HotfixStatements.SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, " +
"SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, LightID, ParticleScale, ParticleMovement, " +
"ParticleTexSlots, MaterialID, MinimapStaticCol, FrameCountTexture1, FrameCountTexture2, FrameCountTexture3, FrameCountTexture4, " +
"FrameCountTexture5, FrameCountTexture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, Float7, `Float8`, Float9, Float10, " +
"Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Coefficient1, Coefficient2, " +
"Coefficient3, Coefficient4 FROM liquid_type WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, LightID, ParticleScale, ParticleMovement, ParticleTexSlots, MaterialID, MinimapStaticCol, FrameCountTexture1, FrameCountTexture2, FrameCountTexture3, FrameCountTexture4, FrameCountTexture5, FrameCountTexture6, Color1, Color2, Color3, Float1, Float2, Float3, `Float4`, Float5, Float6, Float7, `Float8`, Float9, Float10, Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, Float19, Float20, Float21, Float22, Float23, Float24, Float25, Float26, Float27, Float28, Float29, Float30, Float31, Float32, Float33, Float34, Float35, Float36, Float37, Float38, `Int1`, `Int2`, `Int3`, `Int4`, Coefficient1, Coefficient2, Coefficient3, Coefficient4 FROM liquid_type WHERE (`VerifiedBuild` > 0) = ?");
// Location.db2
PrepareStatement(HotfixStatements.SEL_LOCATION, "SELECT ID, PosX, PosY, PosZ, Rot1, Rot2, Rot3 FROM location WHERE (`VerifiedBuild` > 0) = ?");
@@ -955,10 +915,7 @@ namespace Framework.Database
"PvpLongDescription_lang FROM map_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// MapChallengeMode.db2
PrepareStatement(HotfixStatements.SEL_MAP_CHALLENGE_MODE, "SELECT Name, ID, MapID, Flags, ExpansionLevel, RequiredWorldStateID, CriteriaCount1, " +
"CriteriaCount2, CriteriaCount3, FirstRewardQuestID1, FirstRewardQuestID2, FirstRewardQuestID3, FirstRewardQuestID4, FirstRewardQuestID5, " +
"FirstRewardQuestID6, RewardQuestID1, RewardQuestID2, RewardQuestID3, RewardQuestID4, RewardQuestID5, RewardQuestID6 FROM map_challenge_mode" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_MAP_CHALLENGE_MODE, "SELECT Name, ID, MapID, Flags, MaxMedals, ExpansionLevel, RequiredWorldStateID, CriteriaCount1, CriteriaCount2, CriteriaCount3, CriteriaCount4, CriteriaCount5, FirstRewardQuestID1, FirstRewardQuestID2, FirstRewardQuestID3, FirstRewardQuestID4, FirstRewardQuestID5, FirstRewardQuestID6, RewardQuestID1, RewardQuestID2, RewardQuestID3, RewardQuestID4, RewardQuestID5, RewardQuestID6 FROM map_challenge_mode WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_MAP_CHALLENGE_MODE_LOCALE, "SELECT ID, Name_lang FROM map_challenge_mode_locale WHERE (`VerifiedBuild` > 0) = ?" +
" AND locale = ?");
@@ -1004,8 +961,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// Movie.db2
PrepareStatement(HotfixStatements.SEL_MOVIE, "SELECT ID, Volume, KeyID, AudioFileDataID, SubtitleFileDataID, SubtitleFileFormat FROM movie" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_MOVIE, "SELECT ID, Summary, Volume, KeyID, AudioFileDataID, SubtitleFileDataID, SubtitleFileFormat FROM movie WHERE (`VerifiedBuild` > 0) = ?");
// MythicPlusSeason.db2
PrepareStatement(HotfixStatements.SEL_MYTHIC_PLUS_SEASON, "SELECT ID, MilestoneSeason, StartTimeEvent, ExpansionLevel, HeroicLFGDungeonMinGear" +
@@ -1190,7 +1146,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// Scenario.db2
PrepareStatement(HotfixStatements.SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Type, Flags, UiTextureKitID FROM scenario WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Type, Flags, UiTextureKitID, UiScenarioDisplayInfoID FROM scenario WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SCENARIO_LOCALE, "SELECT ID, Name_lang FROM scenario_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// ScenarioStep.db2
@@ -1207,7 +1163,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_GLOBAL_TEXT, "SELECT ID, Name, Script FROM scene_script_global_text WHERE (`VerifiedBuild` > 0) = ?");
// SceneScriptPackage.db2
PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_PACKAGE, "SELECT ID, Name, Unknown915 FROM scene_script_package WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_PACKAGE, "SELECT ID, Name, Flags, Unknown915 FROM scene_script_package WHERE (`VerifiedBuild` > 0) = ?");
// SceneScriptText.db2
PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text WHERE (`VerifiedBuild` > 0) = ?");
@@ -1224,9 +1180,7 @@ namespace Framework.Database
" FROM skill_line_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// SkillLineAbility.db2
PrepareStatement(HotfixStatements.SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, AbilityVerb, AbilityAllVerb, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, " +
"SupercedesSpell, AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, " +
"SkillupSkillLineID FROM skill_line_ability WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SKILL_LINE_ABILITY, "SELECT AbilityVerb, AbilityAllVerb, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, SupercedesSpell, AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, SkillupSkillLineID, RaceMask FROM skill_line_ability WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SKILL_LINE_ABILITY_LOCALE, "SELECT ID, AbilityVerb_lang, AbilityAllVerb_lang FROM skill_line_ability_locale" +
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
@@ -1235,8 +1189,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// SkillRaceClassInfo.db2
PrepareStatement(HotfixStatements.SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID" +
" FROM skill_race_class_info WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID, RaceMask FROM skill_race_class_info WHERE (`VerifiedBuild` > 0) = ?");
// SoulbindConduitRank.db2
PrepareStatement(HotfixStatements.SEL_SOULBIND_CONDUIT_RANK, "SELECT ID, RankIndex, SpellID, AuraPointsOverride, SoulbindConduitID" +
@@ -1273,8 +1226,7 @@ namespace Framework.Database
"RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements WHERE (`VerifiedBuild` > 0) = ?");
// SpellCategories.db2
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORIES, "SELECT ID, DifficultyID, Category, DefenseType, DispelType, Mechanic, PreventionType, " +
"StartRecoveryCategory, ChargeCategory, SpellID FROM spell_categories WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORIES, "SELECT ID, DifficultyID, Category, DefenseType, DiminishType, DispelType, Mechanic, PreventionType, StartRecoveryCategory, ChargeCategory, SpellID FROM spell_categories WHERE (`VerifiedBuild` > 0) = ?");
// SpellCategory.db2
PrepareStatement(HotfixStatements.SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category" +
@@ -1290,15 +1242,10 @@ namespace Framework.Database
"SpellID FROM spell_cooldowns WHERE (`VerifiedBuild` > 0) = ?");
// SpellDuration.db2
PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration FROM spell_duration WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration, DurationPerResource FROM spell_duration WHERE (`VerifiedBuild` > 0) = ?");
// SpellEffect.db2
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, " +
"EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " +
"EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " +
"ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, ScalingClass, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " +
"EffectRadiusIndex2, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ImplicitTarget1, " +
"ImplicitTarget2, SpellID FROM spell_effect WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, ScalingClass, TargetNodeGraph, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, EffectRadiusIndex2, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ImplicitTarget1, ImplicitTarget2, SpellID FROM spell_effect WHERE (`VerifiedBuild` > 0) = ?");
// SpellEmpower.db2
PrepareStatement(HotfixStatements.SEL_SPELL_EMPOWER, "SELECT ID, SpellID, Unused1000 FROM spell_empower WHERE (`VerifiedBuild` > 0) = ?");
@@ -1351,11 +1298,7 @@ namespace Framework.Database
" FROM spell_levels WHERE (`VerifiedBuild` > 0) = ?");
// SpellMisc.db2
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " +
"Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, Attributes15, Attributes16, DifficultyID, " +
"CastingTimeIndex, DurationIndex, PvPDurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, " +
"ActiveIconFileDataID, ContentTuningID, ShowFutureSpellPlayerConditionID, SpellVisualScript, ActiveSpellVisualScript, SpellID FROM spell_misc" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, Attributes15, Attributes16, Attributes17, DifficultyID, CastingTimeIndex, DurationIndex, PvPDurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, ShowFutureSpellPlayerConditionID, SpellVisualScript, ActiveSpellVisualScript, SpellID FROM spell_misc WHERE (`VerifiedBuild` > 0) = ?");
// SpellName.db2
PrepareStatement(HotfixStatements.SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name WHERE (`VerifiedBuild` > 0) = ?");
@@ -1395,12 +1338,10 @@ namespace Framework.Database
"ReagentSource7, ReagentSource8 FROM spell_reagents WHERE (`VerifiedBuild` > 0) = ?");
// SpellReagentsCurrency.db2
PrepareStatement(HotfixStatements.SEL_SPELL_REAGENTS_CURRENCY, "SELECT ID, SpellID, CurrencyTypesID, CurrencyCount FROM spell_reagents_currency" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_REAGENTS_CURRENCY, "SELECT ID, SpellID, CurrencyTypesID, CurrencyCount, OverrideRecraftCurrencyCount, OrderSource FROM spell_reagents_currency WHERE (`VerifiedBuild` > 0) = ?");
// SpellScaling.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, MinScalingLevel, MaxScalingLevel FROM spell_scaling WHERE (`VerifiedBuild` > 0) = ?");
// SpellShapeshift.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " +
@@ -1422,11 +1363,7 @@ namespace Framework.Database
" FROM spell_totems WHERE (`VerifiedBuild` > 0) = ?");
// SpellVisual.db2
PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL, "SELECT ID, MissileCastOffset1, MissileCastOffset2, MissileCastOffset3, MissileImpactOffset1, " +
"MissileImpactOffset2, MissileImpactOffset3, AnimEventSoundID, Flags, MissileAttachment, MissileDestinationAttachment, " +
"MissileCastPositionerID, MissileImpactPositionerID, MissileTargetingKit, HostileSpellVisualID, CasterSpellVisualID, SpellVisualMissileSetID, " +
"DamageNumberDelay, LowViolenceSpellVisualID, RaidSpellVisualMissileSetID, ReducedUnexpectedCameraMovementSpellVisualID FROM spell_visual" +
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL, "SELECT ID, MissileCastOffset1, MissileCastOffset2, MissileCastOffset3, MissileImpactOffset1, MissileImpactOffset2, MissileImpactOffset3, StateKit, AnimEventSoundID, Flags, MissileAttachment, MissileDestinationAttachment, MissileCastPositionerID, MissileImpactPositionerID, MissileTargetingKit, HostileSpellVisualID, CasterSpellVisualID, SpellVisualMissileSetID, DamageNumberDelay, LowViolenceSpellVisualID, RaidSpellVisualMissileSetID, ReducedUnexpectedCameraMovementSpellVisualID FROM spell_visual WHERE (`VerifiedBuild` > 0) = ?");
// SpellVisualEffectName.db2
PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_EFFECT_NAME, "SELECT ID, ModelFileDataID, BaseMissileSpeed, Scale, MinAllowedScale, MaxAllowedScale, " +
@@ -1575,8 +1512,7 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?");
// TraitTree.db2
PrepareStatement(HotfixStatements.SEL_TRAIT_TREE, "SELECT ID, TraitSystemID, Unused1000_1, FirstTraitNodeID, PlayerConditionID, Flags, Unused1000_2, " +
"Unused1000_3 FROM trait_tree WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_TRAIT_TREE, "SELECT TitleText, ID, TraitSystemID, Unused1000_1, FirstTraitNodeID, PlayerConditionID, Flags, Unused1000_2, Unused1000_3, UiTextureKitID FROM trait_tree WHERE (`VerifiedBuild` > 0) = ?");
// TraitTreeLoadout.db2
PrepareStatement(HotfixStatements.SEL_TRAIT_TREE_LOADOUT, "SELECT ID, TraitTreeID, ChrSpecializationID FROM trait_tree_loadout" +
@@ -1622,7 +1558,7 @@ 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, " +
"VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup, ContentTuningID, " +
"AdventureMapTextureKitID, MapArtZoneTextPosition 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 = ?");
@@ -100,6 +100,7 @@ namespace Game.DataStorage
public string GameType;
public string ShortDescription;
public string LongDescription;
public sbyte InstanceType;
public int PvpType;
public byte MinLevel;
public byte MaxLevel;
+6 -2
View File
@@ -63,10 +63,10 @@ namespace Game.DataStorage
public sealed class CharacterLoadoutRecord
{
public uint Id;
public long RaceMask;
public sbyte ChrClassID;
public int Purpose;
public byte ItemContext;
public long RaceMask;
public bool IsForNewCharacter() { return Purpose == 9; }
}
@@ -216,7 +216,6 @@ namespace Game.DataStorage
public sealed class ChrCustomizationReqRecord
{
public uint Id;
public long RaceMask;
public string ReqSource;
public int Flags;
public int ClassMask;
@@ -225,6 +224,7 @@ namespace Game.DataStorage
public int QuestID;
public int OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar
public uint ItemModifiedAppearanceID;
public long RaceMask;
public bool HasFlag(ChrCustomizationReqFlag chrCustomizationReqFlag) { return (Flags & (int)chrCustomizationReqFlag) != 0; }
}
@@ -382,6 +382,7 @@ namespace Game.DataStorage
public int OrderIndex;
public int RedirectContentTuningID;
public int RedirectFlag;
public int RedirectEnum;
public uint ParentContentTuningID;
}
@@ -639,6 +640,9 @@ namespace Game.DataStorage
public uint RechargingCycleDurationMS;
public float AccountTransferPercentage;
public byte OrderIndex;
public float RecraftReagentCountPercentage;
public byte OrderSource;
public int MCRCurrencyID;
public int[] Flags = new int[2];
public bool HasFlag(CurrencyTypesFlags currencyTypesFlags) { return (Flags[0] & (int)currencyTypesFlags) != 0; }
+1 -1
View File
@@ -6,7 +6,6 @@ namespace Game.DataStorage
public sealed class EmotesRecord
{
public uint Id;
public long RaceMask;
public string EmoteSlashCommand;
public short AnimID;
public int EmoteFlags;
@@ -15,6 +14,7 @@ namespace Game.DataStorage
public uint EventSoundID;
public uint SpellVisualKitId;
public int ClassMask;
public long RaceMask;
}
public sealed class EmotesTextRecord
+7 -1
View File
@@ -8,7 +8,6 @@ namespace Game.DataStorage
public sealed class FactionRecord
{
public uint Id;
public long[] ReputationRaceMask = new long[4];
public LocalizedString Name;
public string Description;
public short ReputationIndex;
@@ -25,8 +24,15 @@ namespace Game.DataStorage
public int[] ReputationMax = new int[4];
public float[] ParentFactionMod = new float[2]; // Faction outputs rep * ParentFactionModOut as spillover reputation
public byte[] ParentFactionCap = new byte[2]; // The highest rank the faction will profit from incoming spillover
public long ReputationRaceMask1;
public long ReputationRaceMask2;
public long ReputationRaceMask3;
public long ReputationRaceMask4;
// helpers
// 12.0.7: client stores ReputationRaceMask as 4 separate RaceMask<int32,2> columns; expose as array for existing code
public long[] ReputationRaceMask => new long[] { ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4 };
public bool CanHaveReputation()
{
return ReputationIndex >= 0;
+1 -1
View File
@@ -219,7 +219,6 @@ namespace Game.DataStorage
public uint HordeConstructObjID;
public uint AllianceConstructObjID;
public byte Flags;
public byte UiCategoryID;
public uint[] UpgradeRequirement = new uint[2];
}
@@ -332,6 +331,7 @@ namespace Game.DataStorage
public int TraitTreeID;
public int ProfessionID;
public int Unknown_1002_14;
public int NeighborhoodMapID;
public int SkillLineID;
}
+11 -3
View File
@@ -46,7 +46,11 @@ namespace Game.DataStorage
public uint ItemGroupSoundsID;
public int ContentTuningID;
public int ModifiedCraftingReagentItemID;
public byte Unknown1200;
public int CraftingQualityID;
public int ItemSquishEraID;
public float RecraftReagentCountPercentage;
public byte OrderSource;
}
public sealed class ItemAppearanceRecord
@@ -227,13 +231,15 @@ namespace Game.DataStorage
public ushort SpellCategoryID;
public int SpellID;
public ushort ChrSpecializationID;
public int PlayerConditionID;
}
public sealed class ItemExtendedCostRecord
{
public uint Id;
public ulong Money;
public ushort RequiredArenaRating;
public byte ArenaBracket; // arena slot restrictions (min slot value)
public byte ArenaBracket; // arena slot restrictions (min slot value)
public int Flags;
public byte MinFactionID;
public int MinReputation;
@@ -337,12 +343,12 @@ namespace Game.DataStorage
public int ItemLevel;
public int RequiredLevel;
public int Unknown1125;
public int Flags;
}
public sealed class ItemSearchNameRecord
{
public uint Id;
public long AllowableRace;
public string Display;
public byte OverallQualityID;
public int ExpansionID;
@@ -355,6 +361,7 @@ namespace Game.DataStorage
public uint RequiredAbility;
public ushort ItemLevel;
public int[] Flags = new int[5];
public long AllowableRace;
}
public sealed class ItemSetRecord
@@ -382,7 +389,6 @@ namespace Game.DataStorage
public sealed class ItemSparseRecord
{
public uint Id;
public long AllowableRace;
public string Description;
public string Display3;
public string Display2;
@@ -404,6 +410,7 @@ namespace Game.DataStorage
public uint MaxCount;
public uint MinReputation;
public uint RequiredAbility;
public long AllowableRace;
public uint SellPrice;
public uint BuyPrice;
public uint VendorStackCount;
@@ -416,6 +423,7 @@ namespace Game.DataStorage
public uint PlayerLevelToItemLevelCurveID;
public int ItemLevelOffsetCurveID;
public int ItemLevelOffsetItemLevel;
public int ItemSquishEraID;
public ushort ItemNameDescriptionID;
public ushort RequiredTransmogHoliday;
public ushort RequiredHoliday;
+2 -2
View File
@@ -94,8 +94,8 @@ namespace Game.DataStorage
public byte MaterialID;
public int MinimapStaticCol;
public byte[] FrameCountTexture = new byte[6];
public int[] Color = new int[2];
public float[] Float = new float[18];
public int[] Color = new int[3];
public float[] Float = new float[38];
public uint[] Int = new uint[4];
public float[] Coefficient = new float[4];
}
+3 -1
View File
@@ -116,9 +116,10 @@ namespace Game.DataStorage
public uint Id;
public ushort MapID;
public int Flags;
public int MaxMedals;
public uint ExpansionLevel;
public int RequiredWorldStateID; // maybe?
public short[] CriteriaCount = new short[3];
public short[] CriteriaCount = new short[5];
public int[] FirstRewardQuestID = new int[6];
public int[] RewardQuestID = new int[6];
}
@@ -248,6 +249,7 @@ namespace Game.DataStorage
public sealed class MovieRecord
{
public uint Id;
public LocalizedString Summary;
public byte Volume;
public byte KeyID;
public uint AudioFileDataID;
+11 -4
View File
@@ -15,6 +15,7 @@ namespace Game.DataStorage
public byte Type;
public byte Flags;
public uint UiTextureKitID;
public uint UiScenarioDisplayInfoID;
}
public sealed class ScenarioStepRecord
@@ -59,6 +60,7 @@ namespace Game.DataStorage
{
public uint Id;
public string Name;
public int Flags;
public int Unknown915;
}
@@ -98,7 +100,6 @@ namespace Game.DataStorage
public sealed class SkillLineAbilityRecord
{
public long RaceMask;
public string AbilityVerb;
public string AbilityAllVerb;
public uint Id;
@@ -115,6 +116,7 @@ namespace Game.DataStorage
public short UniqueBit;
public short TradeSkillCategoryID;
public ushort SkillupSkillLineID;
public long RaceMask;
public bool HasFlag(SkillLineAbilityFlags skillLineAbilityFlags) { return (Flags & (int)skillLineAbilityFlags) != 0; }
}
@@ -130,13 +132,13 @@ namespace Game.DataStorage
public sealed class SkillRaceClassInfoRecord
{
public uint Id;
public long RaceMask;
public ushort SkillID;
public int ClassMask;
public int Flags;
public int Availability;
public sbyte MinLevel;
public ushort SkillTierID;
public long RaceMask;
public bool HasFlag(SkillRaceClassInfoFlags skillRaceClassInfoFlags) { return (Flags & (int)skillRaceClassInfoFlags) != 0; }
}
@@ -245,6 +247,7 @@ namespace Game.DataStorage
public byte DifficultyID;
public ushort Category;
public int DefenseType;
public int DiminishType;
public sbyte DispelType;
public sbyte Mechanic;
public int PreventionType;
@@ -291,6 +294,7 @@ namespace Game.DataStorage
public uint Id;
public int Duration;
public int MaxDuration;
public int DurationPerResource;
}
public sealed class SpellEffectRecord
@@ -320,6 +324,7 @@ namespace Game.DataStorage
public float GroupSizeBasePointsCoefficient;
public float EffectBasePoints;
public int ScalingClass;
public int TargetNodeGraph;
public int[] EffectMiscValue = new int[2];
public uint[] EffectRadiusIndex = new uint[2];
public FlagArray128 EffectSpellClassMask;
@@ -446,7 +451,7 @@ namespace Game.DataStorage
public sealed class SpellMiscRecord
{
public uint Id;
public int[] Attributes = new int[16];
public int[] Attributes = new int[17];
public byte DifficultyID;
public ushort CastingTimeIndex;
public ushort DurationIndex;
@@ -551,6 +556,8 @@ namespace Game.DataStorage
public int SpellID;
public ushort CurrencyTypesID;
public ushort CurrencyCount;
public int OverrideRecraftCurrencyCount;
public byte OrderSource;
}
public sealed class SpellScalingRecord
@@ -559,7 +566,6 @@ namespace Game.DataStorage
public uint SpellID;
public uint MinScalingLevel;
public uint MaxScalingLevel;
public ushort ScalesFromItemLevel;
}
public sealed class SpellShapeshiftRecord
@@ -614,6 +620,7 @@ namespace Game.DataStorage
public uint Id;
public float[] MissileCastOffset = new float[3];
public float[] MissileImpactOffset = new float[3];
public int StateKit;
public uint AnimEventSoundID;
public int Flags;
public sbyte MissileAttachment;
@@ -316,6 +316,7 @@ namespace Game.DataStorage
public sealed class TraitTreeRecord
{
public LocalizedString TitleText;
public uint Id;
public uint TraitSystemID;
public int Unused1000_1;
@@ -324,6 +325,7 @@ namespace Game.DataStorage
public int Flags;
public float Unused1000_2;
public float Unused1000_3;
public int UiTextureKitID;
public bool HasFlag(TraitTreeFlag traitTreeFlag) { return (Flags & (int)traitTreeFlag) != 0; }
}
@@ -16,7 +16,6 @@ namespace Game.DataStorage
public UiMapType Type;
public int BountySetID;
public uint BountyDisplayLocation;
public int VisibilityPlayerConditionID2; // if not met then map is skipped when evaluating UiMapAssignment
public int VisibilityPlayerConditionID; // if not met then client checks other maps with the same AlternateUiMapGroup, not re-evaluating UiMapAssignment for them
public sbyte HelpTextPosition;
public int BkgAtlasID;
+177
View File
@@ -0,0 +1,177 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using Framework.Constants;
using Game.Maps;
using Game.Networking;
using Game.Networking.Packets;
using System.Collections.Generic;
namespace Game.Entities
{
public class MeshObject : WorldObject
{
MeshObjectData m_meshObjectData;
Position _stationaryPosition = new();
public MeshObject(bool isWorldObject = false) : base(isWorldObject)
{
ObjectTypeMask |= TypeMask.MeshObject;
ObjectTypeId = TypeId.MeshObject;
m_updateFlag.Stationary = true;
m_updateFlag.MeshObject = true;
m_entityFragments.Add(EntityFragment.Tag_MeshObject, false);
m_meshObjectData = new();
_stationaryPosition = new();
}
public override void AddToWorld()
{
if (!IsInWorld)
{
GetMap().GetObjectsStore().Add(GetGUID(), this);
base.AddToWorld();
}
}
public override void RemoveFromWorld()
{
if (IsInWorld)
{
base.RemoveFromWorld();
GetMap().GetObjectsStore().Remove(GetGUID());
}
}
public static MeshObject CreateMeshObject(Map map, Position pos, ObjectGuid privateObjectOwner)
{
if (map == null)
return null;
ulong lowGuid = map.GenerateLowGuid(HighGuid.MeshObject);
MeshObject meshObject = new();
if (!meshObject.Create(lowGuid, map, pos, privateObjectOwner))
{
meshObject.Dispose();
return null;
}
return meshObject;
}
bool Create(ulong lowGuid, Map map, Position pos, ObjectGuid privateObjectOwner)
{
SetMap(map);
Relocate(pos);
RelocateStationaryPosition(pos);
SetPrivateObjectOwner(privateObjectOwner);
_Create(ObjectGuid.Create(HighGuid.MeshObject, GetMapId(), 0, lowGuid));
SetObjectScale(1.0f);
// Register the updateable mesh-object-data fragment (vendor-style updateable fragment).
m_entityFragments.Add(EntityFragment.FMeshObjectData_C, IsInWorld);
if (!GetMap().AddToMap(this))
return false;
return true;
}
public override void BuildValuesCreate(WorldPacket data, UpdateFieldFlag flags, Player target)
{
m_objectData.WriteCreate(data, flags, this, target);
if (m_meshObjectData != null)
{
if (EntityFragmentsHolder.IsIndirectFragment(EntityFragment.FMeshObjectData_C))
data.WriteUInt8(1); // IndirectFragmentActive: FMeshObjectData_C
m_meshObjectData.WriteCreate(data, flags, this, target);
}
}
public override void BuildValuesUpdate(WorldPacket data, UpdateFieldFlag flags, Player target)
{
if ((m_entityFragments.ContentsChangedMask & m_entityFragments.GetUpdateMaskFor(EntityFragment.CGObject)) != 0)
{
data.WriteUInt32(m_values.GetChangedObjectTypeMask());
if (m_values.HasChanged(TypeId.Object))
m_objectData.WriteUpdate(data, flags, this, target);
}
if (m_meshObjectData != null && (m_entityFragments.ContentsChangedMask & m_entityFragments.GetUpdateMaskFor(EntityFragment.FMeshObjectData_C)) != 0)
m_meshObjectData.WriteUpdate(data, flags, this, target);
}
void BuildValuesUpdateForPlayerWithMask(UpdateData data, UpdateMask requestedObjectMask, UpdateMask requestedMeshObjectMask, Player target)
{
UpdateFieldFlag flags = GetUpdateFieldFlagsFor(target);
UpdateMask valuesMask = new((int)TypeId.Max);
if (requestedObjectMask.IsAnySet())
valuesMask.Set((int)TypeId.Object);
WorldPacket buffer = new();
BuildEntityFragmentsForValuesUpdateForPlayerWithMask(buffer, flags);
buffer.WriteUInt32(valuesMask.GetBlock(0));
if (valuesMask[(int)TypeId.Object])
m_objectData.WriteUpdate(buffer, requestedObjectMask, true, this, target);
// MeshObjectData is an updateable fragment (FMeshObjectData_C), written after the values block.
if (m_meshObjectData != null && requestedMeshObjectMask.IsAnySet())
m_meshObjectData.WriteUpdate(buffer, requestedMeshObjectMask, true, this, target);
WorldPacket buffer1 = new();
buffer1.WriteUInt8((byte)UpdateType.Values);
buffer1.WritePackedGuid(GetGUID());
buffer1.WriteUInt32(buffer.GetSize());
buffer1.WriteBytes(buffer.GetData());
data.AddUpdateBlock(buffer1);
}
public override void ClearUpdateMask(bool remove)
{
m_values.ClearChangesMask(m_meshObjectData);
base.ClearUpdateMask(remove);
}
public override uint GetFaction() { return 0; }
public override Position GetStationaryPosition() { return _stationaryPosition; }
void RelocateStationaryPosition(Position pos) { _stationaryPosition.Relocate(pos); }
class ValuesUpdateForPlayerWithMaskSender
{
MeshObject Owner;
ObjectFieldData ObjectMask = new();
MeshObjectData MeshObjectMask = new();
public ValuesUpdateForPlayerWithMaskSender(MeshObject owner)
{
Owner = owner;
}
public void Invoke(Player player)
{
UpdateData udata = new(Owner.GetMapId());
Owner.BuildValuesUpdateForPlayerWithMask(udata, ObjectMask.GetUpdateMask(), MeshObjectMask.GetUpdateMask(), player);
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
}
@@ -143,6 +143,7 @@ namespace Game.Entities
case HighGuid.Corpse:
case HighGuid.LootObject:
case HighGuid.SceneObject:
case HighGuid.MeshObject:
case HighGuid.Scenario:
case HighGuid.AIGroup:
case HighGuid.DynamicDoor:
@@ -345,6 +346,8 @@ namespace Game.Entities
return TypeId.AreaTrigger;
case HighGuid.SceneObject:
return TypeId.SceneObject;
case HighGuid.MeshObject:
return TypeId.MeshObject;
case HighGuid.Conversation:
return TypeId.Conversation;
default:
@@ -377,6 +380,7 @@ namespace Game.Entities
case HighGuid.Corpse:
case HighGuid.LootObject:
case HighGuid.SceneObject:
case HighGuid.MeshObject:
case HighGuid.Scenario:
case HighGuid.AIGroup:
case HighGuid.DynamicDoor:
@@ -605,6 +609,7 @@ namespace Game.Entities
SET_GUID_INFO(HighGuid.Corpse, FormatWorldObject, ParseWorldObject);
SET_GUID_INFO(HighGuid.LootObject, FormatWorldObject, ParseWorldObject);
SET_GUID_INFO(HighGuid.SceneObject, FormatWorldObject, ParseWorldObject);
SET_GUID_INFO(HighGuid.MeshObject, FormatWorldObject, ParseWorldObject);
SET_GUID_INFO(HighGuid.Scenario, FormatWorldObject, ParseWorldObject);
SET_GUID_INFO(HighGuid.AIGroup, FormatWorldObject, ParseWorldObject);
SET_GUID_INFO(HighGuid.DynamicDoor, FormatWorldObject, ParseWorldObject);
File diff suppressed because it is too large Load Diff
@@ -8,33 +8,52 @@ namespace Game.Entities
{
public enum EntityFragment
{
CGObject = 0, // UPDATEABLE, INDIRECT,
Tag_Item = 1, // TAG,
Tag_Container = 2, // TAG,
Tag_AzeriteEmpoweredItem = 3, // TAG,
Tag_AzeriteItem = 4, // TAG,
Tag_Unit = 5, // TAG,
Tag_Player = 6, // TAG,
Tag_GameObject = 7, // TAG,
Tag_DynamicObject = 8, // TAG,
Tag_Corpse = 9, // TAG,
Tag_AreaTrigger = 10, // TAG,
Tag_SceneObject = 11, // TAG,
Tag_Conversation = 12, // TAG,
Tag_AIGroup = 13, // TAG,
Tag_Scenario = 14, // TAG,
Tag_LootObject = 15, // TAG,
Tag_ActivePlayer = 16, // TAG,
Tag_ActiveClient_S = 17, // TAG,
Tag_ActiveObject_C = 18, // TAG,
Tag_VisibleObject_C = 19, // TAG,
Tag_UnitVehicle = 20, // TAG,
FEntityPosition = 112,
FEntityLocalMatrix = 113,
FEntityWorldMatrix = 114,
CActor = 115, // INDIRECT,
FVendor_C = 117, // UPDATEABLE, INDIRECT,
FMirroredObject_C = 119,
// 12.0.7 (build 68453): fragment IDs renumbered vs 11.2.5; these are written into every object create/update packet.
FEntityPosition = 1,
CGObject = 2, // UPDATEABLE, INDIRECT,
FTransportLink = 5,
FPlayerOwnershipLink = 13,
CActor = 15, // INDIRECT,
FVendor_C = 17, // UPDATEABLE,
FMirroredObject_C = 18,
FMeshObjectData_C = 19, // UPDATEABLE,
FHousingDecor_C = 20, // UPDATEABLE,
FHousingRoom_C = 21, // UPDATEABLE,
FHousingRoomComponentMesh_C = 22, // UPDATEABLE,
FHousingPlayerHouse_C = 23, // UPDATEABLE,
FJamHousingCornerstone_C = 27, // UPDATEABLE,
FHousingDecorActor_C = 28,
FNeighborhoodMirrorData_C = 30, // UPDATEABLE,
FMirroredPositionData_C = 31, // UPDATEABLE,
PlayerHouseInfoComponent_C = 32, // UPDATEABLE, INDIRECT,
FHousingStorage_C = 33, // UPDATEABLE,
FHousingFixture_C = 34, // UPDATEABLE,
PlayerInitiativeComponent_C = 37, // UPDATEABLE, INDIRECT,
Tag_Item = 200, // TAG,
Tag_Container = 201, // TAG,
Tag_AzeriteEmpoweredItem = 202, // TAG,
Tag_AzeriteItem = 203, // TAG,
Tag_Unit = 204, // TAG,
Tag_Player = 205, // TAG,
Tag_GameObject = 206, // TAG,
Tag_DynamicObject = 207, // TAG,
Tag_Corpse = 208, // TAG,
Tag_AreaTrigger = 209, // TAG,
Tag_SceneObject = 210, // TAG,
Tag_Conversation = 211, // TAG,
Tag_AIGroup = 212, // TAG,
Tag_Scenario = 213, // TAG,
Tag_LootObject = 214, // TAG,
Tag_ActivePlayer = 215, // TAG,
Tag_ActiveClient_S = 216, // TAG,
Tag_ActiveObject_C = 217, // TAG,
Tag_VisibleObject_C = 218, // TAG,
Tag_UnitVehicle = 219, // TAG,
Tag_HousingRoom = 220, // TAG,
Tag_MeshObject = 221, // TAG,
Tag_HouseExteriorPiece = 224, // TAG,
Tag_HouseExteriorRoot = 225, // TAG,
Tag_HousingDecorProxyGameObject = 226, // TAG,
End = 255,
}
+10 -1
View File
@@ -39,7 +39,7 @@ namespace Game.Entities
m_movementInfo = new MovementInfo();
m_updateFlag.Clear();
m_entityFragments.Add((int)EntityFragment.CGObject, false);
m_entityFragments.Add(EntityFragment.CGObject, false);
m_objectData = new ObjectFieldData();
@@ -313,6 +313,9 @@ namespace Game.Entities
data.WriteBit(flags.SceneObject);
data.WriteBit(flags.ActivePlayer);
data.WriteBit(flags.Conversation);
data.WriteBit(flags.Room); // 12.0.7: new create-header bit
data.WriteBit(flags.Decor); // 12.0.7: new create-header bit
data.WriteBit(flags.MeshObject); // 12.0.7: new create-header bit
data.FlushBits();
if (flags.MovementUpdate)
@@ -4047,6 +4050,9 @@ namespace Game.Entities
public bool SceneObject;
public bool ActivePlayer;
public bool Conversation;
public bool Room; // 12.0.7: new
public bool Decor; // 12.0.7: new
public bool MeshObject; // 12.0.7: new
public void Clear()
{
@@ -4067,6 +4073,9 @@ namespace Game.Entities
SceneObject = false;
ActivePlayer = false;
Conversation = false;
Room = false;
Decor = false;
MeshObject = false;
}
}
+5
View File
@@ -3579,6 +3579,11 @@ namespace Game.Maps
return _objectsStore.LookupByKey(guid) as SceneObject;
}
public MeshObject GetMeshObject(ObjectGuid guid)
{
return _objectsStore.LookupByKey(guid) as MeshObject;
}
public Conversation GetConversation(ObjectGuid guid)
{
return (Conversation)_objectsStore.LookupByKey(guid);
+1 -1
View File
@@ -77,7 +77,7 @@ namespace Game.Spells
{
Scaling.MinScalingLevel = _scaling.MinScalingLevel;
Scaling.MaxScalingLevel = _scaling.MaxScalingLevel;
Scaling.ScalesFromItemLevel = _scaling.ScalesFromItemLevel;
// 12.0.7: ScalesFromItemLevel removed from SpellScaling.db2
}
// SpellAuraOptionsEntry