Core: Updated to 11.1.0

Port From (https://github.com/TrinityCore/TrinityCore/commit/23624ed75abc8cbb77bb2e24a08e0836e4c41db5)
This commit is contained in:
Hondacrx
2025-06-16 14:47:31 -04:00
parent b6bccbad44
commit 7fd54e6175
65 changed files with 4240 additions and 3968 deletions
+1
View File
@@ -2031,6 +2031,7 @@ namespace Framework.Constants
ForgeMaster = 66, ForgeMaster = 66,
CharacterBanker = 67, CharacterBanker = 67,
AccountBanker = 68, AccountBanker = 68,
ProfessionRespec = 69,
} }
[Flags] [Flags]
+3 -1
View File
@@ -92,6 +92,7 @@ namespace Framework.Constants
ForgeMaster = 55, ForgeMaster = 55,
CharacterBanker = 56, CharacterBanker = 56,
AccountBanker = 57, AccountBanker = 57,
ProfessionRespec = 58,
Max Max
} }
@@ -168,7 +169,8 @@ namespace Framework.Constants
{ {
None = 0x0, None = 0x0,
QuestLabelPrepend = 0x1, QuestLabelPrepend = 0x1,
HideOptionIDFromClient = 0x2 HideOptionIDFromClient = 0x2,
PlayMovieLabelPrepend = 0x4,
} }
[Flags] [Flags]
+1
View File
@@ -467,6 +467,7 @@ namespace Framework.Constants
TransmogSetFavorite = 4, TransmogSetFavorite = 4,
RuneforgeLegendaryAbility = 5, RuneforgeLegendaryAbility = 5,
TransmogIllusion = 6, TransmogIllusion = 6,
WarbandScene = 7,
} }
public enum ItemContext : byte public enum ItemContext : byte
File diff suppressed because it is too large Load Diff
+11 -1
View File
@@ -119,12 +119,22 @@ namespace Framework.Constants
public enum StableResult public enum StableResult
{ {
MaxSlots = 0,
NotEnoughMoney = 1, // "you don't have enough money" NotEnoughMoney = 1, // "you don't have enough money"
NotStableMaster = 2,
InvalidSlot = 3, // "That slot is locked" InvalidSlot = 3, // "That slot is locked"
NoPet = 4,
AlreadyStabled = 5,
AlreadySummoned = 6,
NotFound = 7,
StableSuccess = 8, // stable success StableSuccess = 8, // stable success
UnstableSuccess = 9, // unstable/swap success UnstableSuccess = 9, // unstable/swap success
BuySlotSuccess = 10, // buy slot success ReviveSuccess = 10,
CantControlExotic = 11, // "you are unable to control exotic creatures" CantControlExotic = 11, // "you are unable to control exotic creatures"
InternalError = 12, // "Internal pet error" InternalError = 12, // "Internal pet error"
CheckForLuaHack = 13,
BuySlotSuccess = 14,
FavoriteToggle = 15,
PetRenamed = 16
} }
} }
File diff suppressed because it is too large Load Diff
+93 -50
View File
@@ -775,7 +775,8 @@ namespace Framework.Constants
DragonridingRidingRequirement = 319, DragonridingRidingRequirement = 319,
ItemModAppearanceGroupAlreadyKnown = 320, ItemModAppearanceGroupAlreadyKnown = 320,
ItemCreationDisabledForEvent = 321, ItemCreationDisabledForEvent = 321,
Unknown = 322, WarbandSceneAlreadyKnown = 322,
Unknown = 323,
// Ok Cast Value - Here In Case A Future Version Removes Success And We Need To Use A Custom Value (Not Sent To Client Either Way) // Ok Cast Value - Here In Case A Future Version Removes Success And We Need To Use A Custom Value (Not Sent To Client Either Way)
SpellCastOk = Success SpellCastOk = Success
@@ -1410,55 +1411,97 @@ namespace Framework.Constants
RequiresAResilientStone = 832, // Requires A Resilient Stone. RequiresAResilientStone = 832, // Requires A Resilient Stone.
MyrritCannotCarryAnyMoreMaps = 835, // Myrrit Cannot Carry Any More Maps. Go On A Dig With Him! MyrritCannotCarryAnyMoreMaps = 835, // Myrrit Cannot Carry Any More Maps. Go On A Dig With Him!
SomeGiftsAreBetterLeftUndelivered = 836, // Some gifts are better left undelivered. SomeGiftsAreBetterLeftUndelivered = 836, // Some gifts are better left undelivered.
RequiresNiffenCaveDiveKeyandShieldDisabled = 850, // Requires Niffen Cave Dive Key And Shield Disabled. CompanionIsUnconscious = 837, // Companion Is Unconscious!
ElusiveCreatureBaitWasRecentlyUsed = 851, // You Cannot Lure Anything In This Area For A Few Minutes. Elusive Creature Bait Was Recently Used. RequiresCompanion = 838, // Requires Companion.
MustBeInQuietPlaceWithinCaerDarrow = 852, // Must be in a suitably quiet place within Caer Darrow. YouAteTooManyDesserts = 840, // You Should Not Eat Too Many Desserts If You Wish To Be Invited To The Next Party.
YouDontHaveAnyGlimmerOfLightsActive = 856, // You don't have any Glimmer of Lights active. OnlyUsableDuringLoveIsInTheAir = 841, // Only Usable During Love Is In The Air
YouDontHaveTheSwirlingMojoStone = 999, // You Don'T Have The Swirling Mojo Stone Equipped. NoSmellsNearby = 842, // No Smells Nearby!
YouMustBeNearADragonflightOathstone = 1000, // You Must Be Near One Of The Five Dragonflight Oathstones In The Dragon Isles. YouAlreadyHaveAConjuredFlask = 845, // You Already Have A Conjured Flask.
CanOnlyUseThisItemWhileAirborne = 1001, // You Can Only Use This Item While Airborne. YouAlreadyHaveSomeConjuredPotions = 846, // You Already Have Some Conjured Potions.
ThisPlayerIsNotOppositeFaction = 1002, // This Player Is Not Of The Opposite Faction. Requiresniffencavedivekeyandshielddisabled = 850, // Requires Niffen Cave Dive Key And Shield Disabled.
ThisPlayerAlreadyHasThisMount = 1003, // This Player Already Has This Mount. Elusivecreaturebaitwasrecentlyused = 851, // You Cannot Lure Anything In This Area For A Few Minutes. Elusive Creature Bait Was Recently Used.
YourTargetIsInWarMode = 1004, // Your Target Is In War Mode. Mustbeinquietplacewithincaerdarrow = 852, // Must Be In A Suitably Quiet Place Within Caer Darrow.
CooldownReset = 1005, // Cooldown Reset YouNeedShadowrootedGrippers = 853, // You Need Shadowrooted Grippers.
SoilNutrientsMustReplenish = 1006, // The Nutrients Of This Soil Must Replenish Before Further Growth. Youdonthaveanyglimmeroflightsactive = 856, // You Don't Have Any Glimmer Of Lights Active.
TargetAlreadyHadSomeFeathersPlucked = 1007, // The Target Has Already Had Some Feathers Plucked. It Would Be Rude To Take More. OnlyTheForsakenCanDisplayThisHonor = 857, // Only The Forsaken Can Display This Honor.
ThisCreatureHasAlreadyBeenAttunedWith = 1008, // This Creature Has Already Been Attuned With Recently. EnoughMoonkinHatchlingsAlreadyFollowYou = 858, // Enough Moonkin Hatchlings Already Follow You.
YouAlreadyHaveSomeMulchPrepared = 1009, // You Already Have Some Mulch Prepared. Use Your Current Mulch First. YouCanOnlyOpenThisChestInYourDreams = 859, // You Can Only Open This Chest In Your Dreams.
YouDontKnowHowToGatherThis = 1010, // You Don't Know How To Gather This. YouHaveNotProvenYourselfToThisSpirit = 860, // You Have Not Proven Yourself To This Spirit.
YouDontHaveAnyItemsOfThisType = 1011, // You Don't Have Any Items Of This Type. NotEnoughDelveEmpowerment = 861, // Not Enough Delve Empowerment.
YouDontHaveAnyRadiantRemnants = 1012, // You Don't Have Any Radiant Remnants. ThisItemCannotBeUsedInTheCurrentSeason = 870, // This Item Cannot Be Used In The Current Season.
TargetsRingIsAlreadyBoundToAnotherPlayer = 1013, // Your Target's Ring Is Already Bound To Another Player. YouCannotEnterADelveWhileInARaidGroup = 871, // You Cannot Enter A Delve While In A Raid Group.
TargetIsNotWearingThisRing = 1014, // Your Target Is Not Also Wearing This Ring. YourCompanionIsInCombat = 872, // Your Companion Is In Combat.
CanOnlyBeUsedOnSocketablePvpTwwItems = 1015, // Can Only Be Used On Socket Eligible Pvp Items From The War Within Expansion. ThisDelveIsNotAvailableForTesting = 873, // This Delve Is Not Available For Testing. Check Back Later!
HarvestbotsAlreadyActive = 1016, // Harvestbots Already Active. YouAreAlreadyAtFullVigor = 891, // You Are Already At Full Vigor
AirshipDauntlessIsAlreadyActive = 1017, // The Airship Dauntless Is Already Active. YouAlreadyHaveAtLeastOneConjuredFlask = 892, // You Already Have At Least One Conjured Flask.
CannotSwapSpellsOnCooldownInCombat = 1026, // You Cannot Swap Spells On Cooldown While In Combat. ActiveFlasksCanOnlyBeChangedOutsOfCombat = 893, // Active Flasks Can Only Be Changed Outside Of Combat.
MustEquipCloakOfInfinitePotential = 1027, // You Must First Equip The Cloak Of Infinite Potential. ThisCannotBeCraftedDuringEarlyAccess = 900, // This Cannot Be Crafted During Early Access.
InsufficientBronze = 1028, // You Have Insufficient Bronze To Make This Trade. Youdonthavetheswirlingmojostone = 999, // You Don't Have The Swirling Mojo Stone Equipped.
RequiresSkyriding = 1029, // Requires Skyriding Youmustbenearadragonflightoathstone = 1000, // You Must Be Near One Of The Five Dragonflight Oathstones In The Dragon Isles.
YouAlreadyOverloadedThisGatheringNode = 1030, // You Have Already Overloaded This Gathering Node. Canonlyusethisitemwhileairborne = 1001, // You Can Only Use This Item While Airborne.
YouDontKnowHowToOverloadThisNode = 1031, // You Do Not Know How To Overload This Gathering Node. Thisplayerisnotoppositefaction = 1002, // This Player Is Not Of The Opposite Faction.
TimerunnersCannotTeleportOutOfPandaria = 1032, // Timerunners Cannot Teleport Outside Of Pandaria. Thisplayeralreadyhasthismount = 1003, // This Player Already Has This Mount.
SpecializeFurtherForTheseNotes = 1033, // Specialize Further Or Improve Your Hasty Handwriting To Make Sense Of These Notes. Yourtargetisinwarmode = 1004, // Your Target Is In War Mode.
ThereIsNothingLeftToInvent = 1034, // There Is Nothing Left To Invent And You Cannot Be Convinced Otherwise. Cooldownreset = 1005, // Cooldown Reset
PlayerInPartyDoesntHaveThisTierUnlocked = 1035, // A Player In Your Party Does Not Have This Tier Unlocked Soilnutrientsmustreplenish = 1006, // The Nutrients Of This Soil Must Replenish Before Further Growth.
YouDontHaveAnyRadiantEchoes = 1036, // You Don't Have Any Radiant Echoes. Targetalreadyhadsomefeathersplucked = 1007, // The Target Has Already Had Some Feathers Plucked. It Would Be Rude To Take More.
RequiresTwwPathfinderUnlocked = 1037, // Requires The War Within Pathfinder Unlocked To Use In This Area. Thiscreaturehasalreadybeenattunedwith = 1008, // This Creature Has Already Been Attuned With Recently.
CanOnlyBeUsedWhileInCombat = 1039, // Can Only Be Used While In Combat. Youalreadyhavesomemulchprepared = 1009, // You Already Have Some Mulch Prepared. Use Your Current Mulch First.
NotHighEnoughLevelToEnterADelve = 1040, // You Are Not High Enough Level To Enter A Delve. Youdontknowhowtogatherthis = 1010, // You Don't Know How To Gather This.
WondrousWisdomballIsNonresponsive = 1041, // For Some Reason The Wondrous Wisdomball Is Nonresponsive. Youdonthaveanyitemsofthistype = 1011, // You Don't Have Any Items Of This Type.
YouAlreadyHaveThisCurioInYourCollection = 1042, // You Already Have This Curio In Your Collection. Youdonthaveanyradiantremnants = 1012, // You Don't Have Any Radiant Remnants.
AlreadyHaveIdentifiedPrototype = 1043, // You Must Choose What To Do With Your Current Prototype Before Identifying New Ones. Targetsringisalreadyboundtoanotherplayer = 1013, // Your Target's Ring Is Already Bound To Another Player.
YouAlreadyUsedKhazAlgarContract = 1044, // You Have Already Used A Khaz Algar Contract This Week. Targetisnotwearingthisring = 1014, // Your Target Is Not Also Wearing This Ring.
YouAlreadyRevealedAllTodayPactLocations = 1051, // You Have Revealed Or Completed All Of Today's Pact Locations. Canonlybeusedonsocketablepvptwwitems = 1015, // Can Only Be Used On Socket Eligible Pvp Items From The War Within Expansion.
TimerunnersCannotCastThisSpell = 1053, // Timerunners Cannot Cast This Spell. Harvestbotsalreadyactive = 1016, // Harvestbots Already Active.
ThisEmblemHasNoMagicStored = 2001, // The Emblem Has No Magic Stored. Airshipdauntlessisalreadyactive = 1017, // The Airship Dauntless Is Already Active.
YouMustBeInVisageForm = 2222, // You Must Be In Visage Form To Do This. Cannotswapspellsoncooldownincombat = 1026, // You Cannot Swap Spells On Cooldown While In Combat.
ATrialIsBeingUndergoneNearby = 2223, // A Trial Is Already Being Undergone Nearby. Mustequipcloakofinfinitepotential = 1027, // You Must First Equip The Cloak Of Infinite Potential.
YouCannotUseVantusRuneInStoryMode = 2224, // You Cannot Use A Vantus Rune In Story Mode. Insufficientbronze = 1028, // You Have Insufficient Bronze To Make This Trade.
TooCloseToAnotherMoltenRitual = 2424, // You Can't Begin A Molten Ritual This Close To Another One. Requiresskyriding = 1029, // Requires Skyriding
EarthenCannotConsumeRegularFoodOrDrink = 2425, // Earthen Cannot Consume Traditional Food Or Drink. Youalreadyoverloadedthisgatheringnode = 1030, // You Have Already Overloaded This Gathering Node.
Youdontknowhowtooverloadthisnode = 1031, // You Do Not Know How To Overload This Gathering Node.
Timerunnerscannotteleportoutofpandaria = 1032, // Timerunners Cannot Teleport Outside Of Pandaria.
Specializefurtherforthesenotes = 1033, // Specialize Further Or Improve Your Hasty Handwriting To Make Sense Of These Notes.
Thereisnothinglefttoinvent = 1034, // There Is Nothing Left To Invent And You Cannot Be Convinced Otherwise.
Playerinpartydoesnthavethistierunlocked = 1035, // A Player In Your Party Does Not Have This Tier Unlocked
Youdonthaveanyradiantechoes = 1036, // You Don't Have Any Radiant Echoes.
Requirestwwpathfinderunlocked = 1037, // Requires The War Within Pathfinder Unlocked To Use In This Area.
YouDoNotOwnThatMount = 1038, // You Do Not Own That Mount.
Canonlybeusedwhileincombat = 1039, // Can Only Be Used While In Combat.
Nothighenoughleveltoenteradelve = 1040, // You Are Not High Enough Level To Enter A Delve.
Wondrouswisdomballisnonresponsive = 1041, // For Some Reason The Wondrous Wisdomball Is Nonresponsive.
Youalreadyhavethiscurioinyourcollection = 1042, // You Already Have This Curio In Your Collection.
Alreadyhaveidentifiedprototype = 1043, // You Must Choose What To Do With Your Current Prototype Before Identifying New Ones.
Youalreadyusedkhazalgarcontract = 1044, // You Have Already Used A Khaz Algar Contract This Week.
Locked = 1045, // Locked.
MarksmanshipHuntersCannotUseCallPet = 1050, // Marksmanship Hunters Cannot Use Call Pet.
Youalreadyrevealedalltodaypactlocations = 1051, // You Have Revealed Or Completed All Of Today's Pact Locations.
YouHaveNoBlacksteelCannonballs = 1052, // You Have No Blacksteel Cannonballs
Timerunnerscannotcastthisspell = 1053, // Timerunners Cannot Cast This Spell.
ThatCantBeUsedHere = 1054, // That Can't Be Used Here.
YouAreNotYetEligibleToUseThisItem = 1056, // You Are Not Yet Eligible To Use This Item.
RequiresShadowforgeTorch = 1057, // Lighting The Shadowforge Brazier Requires A Shadowforge Torch.
ThisShadowforgeBrazierIsAlreadyBurning = 1058, // This Shadowforge Brazier Is Already Burning.
FullBags = 1059, // Full Bags
YouMustBeARatToPassThroughHere = 1060, // You Must Be A Rat To Pass Through Here.
YourHandsAreFull = 1061, // Your Hands Are Full.
MustReachEmpoweredRestorationStone = 1064, // Must Reach Empowered Restoration Stone.
CantDoThisNow = 1066, // Can't Do This Now.
NoEligibleBountifulDelves = 1067, // No Eligible Bountiful Delves.
OnlyARogueCouldPickThisLock = 1068, // Only A Rogue Could Pick This Lock.
TheMegaMagnetMustBeChargedFirst = 1070, // The Mega Magnet Must Be Charged First!
MustTargetEligibleHeadChestOrLegSetItem = 1071, // Must Target An Eligible Head, Chest, Or Leg Class Set Item.
MustTargetEligibleShoulderOrHandSetItem = 1072, // Must Target An Eligible Shoulder Or Hand Class Set Item.
CannotMountWhileDisguised = 1074, // Cannot Mount While Disguised.
YourTargetIsProtectedByDarkfuseMedichopper = 1075, // Your Target Is Already Protected By A Darkfuse Medichopper.
Thisemblemhasnomagicstored = 2001, // The Emblem Has No Magic Stored.
Youmustbeinvisageform = 2222, // You Must Be In Visage Form To Do This.
Atrialisbeingundergonenearby = 2223, // A Trial Is Already Being Undergone Nearby.
Youcannotusevantusruneinstorymode = 2224, // You Cannot Use A Vantus Rune In Story Mode.
Tooclosetoanothermoltenritual = 2424, // You Can't Begin A Molten Ritual This Close To Another One.
Earthencannotconsumeregularfoodordrink = 2425, // Earthen Cannot Consume Traditional Food Or Drink.
BarrierProtectsTheAmplifierFromLosingPower = 2427, // A Barrier Protects The Amplifier From Losing Power.
} }
public enum SpellMissInfo public enum SpellMissInfo
@@ -227,7 +227,8 @@ namespace Framework.Database
// ChallengeModeItemBonusOverride.db2 // ChallengeModeItemBonusOverride.db2
PrepareStatement(HotfixStatements.SEL_CHALLENGE_MODE_ITEM_BONUS_OVERRIDE, "SELECT ID, ItemBonusTreeGroupID, DstItemBonusTreeID, Value, " + PrepareStatement(HotfixStatements.SEL_CHALLENGE_MODE_ITEM_BONUS_OVERRIDE, "SELECT ID, ItemBonusTreeGroupID, DstItemBonusTreeID, Value, " +
"RequiredTimeEventPassed, SrcItemBonusTreeID FROM challenge_mode_item_bonus_override WHERE (`VerifiedBuild` > 0) = ?"); "RequiredTimeEventPassed, RequiredTimeEventNotPassed, SrcItemBonusTreeID FROM challenge_mode_item_bonus_override" +
" WHERE (`VerifiedBuild` > 0) = ?");
// CharBaseInfo.db2 // CharBaseInfo.db2
PrepareStatement(HotfixStatements.SEL_CHAR_BASE_INFO, "SELECT ID, RaceID, ClassID, OtherFactionRaceID FROM char_base_info WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_CHAR_BASE_INFO, "SELECT ID, RaceID, ClassID, OtherFactionRaceID FROM char_base_info WHERE (`VerifiedBuild` > 0) = ?");
@@ -257,11 +258,11 @@ namespace Framework.Database
// ChrClasses.db2 // ChrClasses.db2
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " + PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " +
"HyphenatedNameMale, HyphenatedNameFemale, ID, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " + "HyphenatedNameMale, HyphenatedNameFemale, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " +
"SpellTextureBlobFileDataID, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " + "SpellTextureBlobFileDataID, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " +
"MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " + "MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " +
"CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " + "CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " +
"CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, DisplayPower, " + "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, ID, PrimaryStatPriority, DisplayPower, " +
"RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ClassColorR, ClassColorG, ClassColorB, RolesMask" + "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ClassColorR, ClassColorG, ClassColorB, RolesMask" +
" FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?"); " FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " + PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " +
@@ -297,8 +298,8 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// ChrCustomizationReq.db2 // ChrCustomizationReq.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, RaceMask, ReqSource, Flags, ClassMask, AchievementID, QuestID, OverrideArchive, " + PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, RaceMask, ReqSource, Flags, ClassMask, RegionGroupMask, AchievementID, QuestID, " +
"ItemModifiedAppearanceID FROM chr_customization_req WHERE (`VerifiedBuild` > 0) = ?"); "OverrideArchive, ItemModifiedAppearanceID 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) = ?" + PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_REQ_LOCALE, "SELECT ID, ReqSource_lang FROM chr_customization_req_locale WHERE (`VerifiedBuild` > 0) = ?" +
" AND locale = ?"); " AND locale = ?");
@@ -319,15 +320,15 @@ namespace Framework.Database
// ChrRaces.db2 // ChrRaces.db2
PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ID, ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, " + PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ID, ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, " +
"LoreName, LoreNameFemale, LoreNameLower, LoreNameLowerFemale, LoreDescription, ShortName, ShortNameFemale, ShortNameLower, " + "LoreName, LoreNameFemale, LoreNameLower, LoreNameLowerFemale, LoreDescription, ShortName, ShortNameFemale, ShortNameLower, " +
"ShortNameLowerFemale, Flags, FactionID, CinematicSequenceID, ResSicknessSpellID, SplashSoundID, Alliance, RaceRelated, " + "ShortNameLowerFemale, Flags, FactionID, CinematicSequenceID, ResSicknessSpellID, SplashSoundID, CreateScreenFileDataID, " +
"UnalteredVisualRaceID, DefaultClassID, CreateScreenFileDataID, SelectScreenFileDataID, NeutralRaceID, LowResScreenFileDataID, " + "SelectScreenFileDataID, LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " +
"AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, " + "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " +
"AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, UiDisplayOrder, " + "UiDisplayOrder, PlayableRaceBit, TransmogrifyDisabledSlotMask, AlteredFormCustomizeOffsetFallback1, AlteredFormCustomizeOffsetFallback2, " +
"MaleModelFallbackRaceID, FemaleModelFallbackRaceID, MaleTextureFallbackRaceID, FemaleTextureFallbackRaceID, PlayableRaceBit, " + "AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, Unknown910_11, Unknown910_12, Unknown910_13, Unknown910_21, " +
"HelmetAnimScalingRaceID, TransmogrifyDisabledSlotMask, UnalteredVisualCustomizationRaceID, AlteredFormCustomizeOffsetFallback1, " + "Unknown910_22, Unknown910_23, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, DefaultClassID, NeutralRaceID, " +
"AlteredFormCustomizeOffsetFallback2, AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, Unknown910_11, " + "MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, FemaleModelFallbackSex, MaleTextureFallbackRaceID, " +
"Unknown910_12, Unknown910_13, Unknown910_21, Unknown910_22, Unknown910_23, Unknown1000, BaseLanguage, CreatureType, MaleModelFallbackSex, " + "MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex, HelmetAnimScalingRaceID, UnalteredVisualCustomizationRaceID" +
"FemaleModelFallbackSex, MaleTextureFallbackSex, FemaleTextureFallbackSex FROM chr_races WHERE (`VerifiedBuild` > 0) = ?"); " FROM chr_races WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, LoreName_lang, " + PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, LoreName_lang, " +
"LoreNameFemale_lang, LoreNameLower_lang, LoreNameLowerFemale_lang, LoreDescription_lang, ShortName_lang, ShortNameFemale_lang, " + "LoreNameFemale_lang, LoreNameLower_lang, LoreNameLowerFemale_lang, LoreDescription_lang, ShortName_lang, ShortNameFemale_lang, " +
"ShortNameLower_lang, ShortNameLowerFemale_lang FROM chr_races_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); "ShortNameLower_lang, ShortNameLowerFemale_lang FROM chr_races_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
@@ -427,7 +428,7 @@ namespace Framework.Database
// CurrencyTypes.db2 // CurrencyTypes.db2
PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " +
"MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, " + "MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, " +
"RechargingAmountPerCycle, RechargingCycleDurationMS, AccountTransferPercentage, Flags1, Flags2 FROM currency_types WHERE (`VerifiedBuild` > 0) = ?"); "RechargingAmountPerCycle, RechargingCycleDurationMS, AccountTransferPercentage, OrderIndex, 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) = ?" + PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE (`VerifiedBuild` > 0) = ?" +
" AND locale = ?"); " AND locale = ?");
@@ -631,7 +632,7 @@ namespace Framework.Database
// GossipNpcOption.db2 // GossipNpcOption.db2
PrepareStatement(HotfixStatements.SEL_GOSSIP_NPC_OPTION, "SELECT ID, GossipNpcOption, LFGDungeonsID, TrainerID, GarrFollowerTypeID, CharShipmentID, " + 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, " + "GarrTalentTreeID, UiMapID, UiItemInteractionID, Unknown_1000_8, Unknown_1000_9, CovenantID, GossipOptionID, TraitTreeID, ProfessionID, " +
"Unknown_1002_14 FROM gossip_npc_option WHERE (`VerifiedBuild` > 0) = ?"); "Unknown_1002_14, SkillLineID FROM gossip_npc_option WHERE (`VerifiedBuild` > 0) = ?");
// GuildColorBackground.db2 // GuildColorBackground.db2
PrepareStatement(HotfixStatements.SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Blue, Green FROM guild_color_background WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Blue, Green FROM guild_color_background WHERE (`VerifiedBuild` > 0) = ?");
@@ -866,7 +867,7 @@ namespace Framework.Database
// JournalInstance.db2 // JournalInstance.db2
PrepareStatement(HotfixStatements.SEL_JOURNAL_INSTANCE, "SELECT ID, Name, Description, MapID, BackgroundFileDataID, ButtonFileDataID, " + PrepareStatement(HotfixStatements.SEL_JOURNAL_INSTANCE, "SELECT ID, Name, Description, MapID, BackgroundFileDataID, ButtonFileDataID, " +
"ButtonSmallFileDataID, LoreFileDataID, Flags, AreaID FROM journal_instance WHERE (`VerifiedBuild` > 0) = ?"); "ButtonSmallFileDataID, LoreFileDataID, Flags, AreaID, CovenantID FROM journal_instance WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_JOURNAL_INSTANCE_LOCALE, "SELECT ID, Name_lang, Description_lang FROM journal_instance_locale" + PrepareStatement(HotfixStatements.SEL_JOURNAL_INSTANCE_LOCALE, "SELECT ID, Name_lang, Description_lang FROM journal_instance_locale" +
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
@@ -967,7 +968,7 @@ namespace Framework.Database
// MountCapability.db2 // MountCapability.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " + PrepareStatement(HotfixStatements.SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " +
"ReqMapID, PlayerConditionID, FlightCapabilityID FROM mount_capability WHERE (`VerifiedBuild` > 0) = ?"); "ReqMapID, PlayerConditionID, FlightCapabilityID, DriveCapabilityID FROM mount_capability WHERE (`VerifiedBuild` > 0) = ?");
// MountEquipment.db2 // MountEquipment.db2
PrepareStatement(HotfixStatements.SEL_MOUNT_EQUIPMENT, "SELECT ID, Item, BuffSpell, Unknown820, LearnedBySpell FROM mount_equipment" + PrepareStatement(HotfixStatements.SEL_MOUNT_EQUIPMENT, "SELECT ID, Item, BuffSpell, Unknown820, LearnedBySpell FROM mount_equipment" +
@@ -1105,7 +1106,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_QUEST_INFO_LOCALE, "SELECT ID, InfoName_lang FROM quest_info_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); PrepareStatement(HotfixStatements.SEL_QUEST_INFO_LOCALE, "SELECT ID, InfoName_lang FROM quest_info_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// QuestLineXQuest.db2 // QuestLineXQuest.db2
PrepareStatement(HotfixStatements.SEL_QUEST_LINE_X_QUEST, "SELECT ID, QuestLineID, QuestID, OrderIndex, Flags FROM quest_line_x_quest" + PrepareStatement(HotfixStatements.SEL_QUEST_LINE_X_QUEST, "SELECT ID, QuestLineID, QuestID, OrderIndex, Flags, Unknown1110 FROM quest_line_x_quest" +
" WHERE (`VerifiedBuild` > 0) = ?"); " WHERE (`VerifiedBuild` > 0) = ?");
// QuestMoneyReward.db2 // QuestMoneyReward.db2
+2 -2
View File
@@ -1343,7 +1343,7 @@ namespace Game
} }
AuctionWonNotification packet = new(); AuctionWonNotification packet = new();
packet.Info.Initialize(auctions[0], items[0].Items[0]); packet.Info.Initialize(_auctionHouse.Id, auctions[0], items[0].Items[0]);
player.SendPacket(packet); player.SendPacket(packet);
for (int i = 0; i < auctions.Count; ++i) for (int i = 0; i < auctions.Count; ++i)
@@ -1445,7 +1445,7 @@ namespace Game
if (bidder != null) if (bidder != null)
{ {
AuctionWonNotification packet = new(); AuctionWonNotification packet = new();
packet.Info.Initialize(auction, auction.Items[0]); packet.Info.Initialize(_auctionHouse.Id, auction, auction.Items[0]);
bidder.SendPacket(packet); bidder.SendPacket(packet);
// FIXME: for offline player need also // FIXME: for offline player need also
+2 -2
View File
@@ -1216,8 +1216,8 @@ namespace Game.BattleGrounds
playerData.IsInWorld = true; playerData.IsInWorld = true;
playerData.PrimaryTalentTree = (int)player.GetPrimarySpecialization(); playerData.PrimaryTalentTree = (int)player.GetPrimarySpecialization();
playerData.Sex = (sbyte)player.GetGender(); playerData.Sex = (sbyte)player.GetGender();
playerData.PlayerRace = player.GetRace(); playerData.PlayerRace = (sbyte)player.GetRace();
playerData.PlayerClass = (int)player.GetClass(); playerData.PlayerClass = (sbyte)player.GetClass();
playerData.HonorLevel = (int)player.GetHonorLevel(); playerData.HonorLevel = (int)player.GetHonorLevel();
pvpLogData.Statistics.Add(playerData); pvpLogData.Statistics.Add(playerData);
@@ -138,7 +138,7 @@ namespace Game.BattleGrounds
battlefieldStatus = new BattlefieldStatusActive(); battlefieldStatus = new BattlefieldStatusActive();
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId); BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
battlefieldStatus.ShutdownTimer = bg.GetRemainingTime(); battlefieldStatus.ShutdownTimer = bg.GetRemainingTime();
battlefieldStatus.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? BattleGroundTeamId.Horde : BattleGroundTeamId.Alliance); battlefieldStatus.ArenaFaction = (sbyte)(player.GetBGTeam() == Team.Horde ? BattleGroundTeamId.Horde : BattleGroundTeamId.Alliance);
battlefieldStatus.LeftEarly = false; battlefieldStatus.LeftEarly = false;
battlefieldStatus.StartTimer = bg.GetElapsedTime(); battlefieldStatus.StartTimer = bg.GetElapsedTime();
battlefieldStatus.Mapid = bg.GetMapId(); battlefieldStatus.Mapid = bg.GetMapId();
+2 -2
View File
@@ -2416,7 +2416,7 @@ namespace Game.DataStorage
MultiMap<uint, int> _creatureLabels = new(); MultiMap<uint, int> _creatureLabels = new();
MultiMap<uint, CurrencyContainerRecord> _currencyContainers = new(); MultiMap<uint, CurrencyContainerRecord> _currencyContainers = new();
MultiMap<uint, Vector2> _curvePoints = new(); MultiMap<uint, Vector2> _curvePoints = new();
Dictionary<Tuple<uint, byte, byte, byte>, EmotesTextSoundRecord> _emoteTextSounds = new(); Dictionary<Tuple<uint, sbyte, sbyte, sbyte>, EmotesTextSoundRecord> _emoteTextSounds = new();
Dictionary<Tuple<uint, int>, ExpectedStatRecord> _expectedStatsByLevel = new(); Dictionary<Tuple<uint, int>, ExpectedStatRecord> _expectedStatsByLevel = new();
MultiMap<uint, ContentTuningXExpectedRecord> _expectedStatModsByContentTuning = new(); MultiMap<uint, ContentTuningXExpectedRecord> _expectedStatModsByContentTuning = new();
MultiMap<uint, uint> _factionTeams = new(); MultiMap<uint, uint> _factionTeams = new();
@@ -2438,7 +2438,7 @@ namespace Game.DataStorage
Dictionary<uint, MountRecord> _mountsBySpellId = new(); Dictionary<uint, MountRecord> _mountsBySpellId = new();
MultiMap<uint, MountTypeXCapabilityRecord> _mountCapabilitiesByType = new(); MultiMap<uint, MountTypeXCapabilityRecord> _mountCapabilitiesByType = new();
MultiMap<uint, MountXDisplayRecord> _mountDisplays = new(); MultiMap<uint, MountXDisplayRecord> _mountDisplays = new();
Dictionary<uint, List<NameGenRecord>[]> _nameGenData = new(); Dictionary<sbyte, List<NameGenRecord>[]> _nameGenData = new();
List<string>[] _nameValidators = new List<string>[(int)Locale.Total + 1]; List<string>[] _nameValidators = new List<string>[(int)Locale.Total + 1];
Dictionary<uint, ParagonReputationRecord> _paragonReputations = new(); Dictionary<uint, ParagonReputationRecord> _paragonReputations = new();
Dictionary<uint, PathDb2> _paths = new(); Dictionary<uint, PathDb2> _paths = new();
+1 -1
View File
@@ -378,7 +378,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public uint AzeritePowerSetID; public uint AzeritePowerSetID;
public int AzeritePowerID; public int AzeritePowerID;
public int Class; public sbyte Class;
public byte Tier; public byte Tier;
public uint OrderIndex; public uint OrderIndex;
} }
+2 -2
View File
@@ -26,8 +26,8 @@ namespace Game.DataStorage
public string Description; public string Description;
public byte Type; // value 0 . hair, value 2 . facialhair public byte Type; // value 0 . hair, value 2 . facialhair
public float CostModifier; public float CostModifier;
public byte Race; public sbyte Race;
public byte Sex; public sbyte Sex;
public byte Data; // real ID to hair/facial hair public byte Data; // real ID to hair/facial hair
} }
+23 -21
View File
@@ -38,6 +38,7 @@ namespace Game.DataStorage
public int DstItemBonusTreeID; public int DstItemBonusTreeID;
public int Value; public int Value;
public int RequiredTimeEventPassed; public int RequiredTimeEventPassed;
public int RequiredTimeEventNotPassed;
public uint SrcItemBonusTreeID; public uint SrcItemBonusTreeID;
} }
@@ -46,7 +47,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public sbyte RaceID; public sbyte RaceID;
public sbyte ClassID; public sbyte ClassID;
public int OtherFactionRaceID; public sbyte OtherFactionRaceID;
} }
public sealed class CharTitlesRecord public sealed class CharTitlesRecord
@@ -82,7 +83,7 @@ namespace Game.DataStorage
public LocalizedString Name; public LocalizedString Name;
public string Shortcut; public string Shortcut;
public int Flags; public int Flags;
public sbyte FactionGroup; public byte FactionGroup;
public int Ruleset; public int Ruleset;
public bool HasFlag(ChatChannelFlags chatChannelFlags) { return (Flags & (int)chatChannelFlags) != 0; } public bool HasFlag(ChatChannelFlags chatChannelFlags) { return (Flags & (int)chatChannelFlags) != 0; }
@@ -92,7 +93,7 @@ namespace Game.DataStorage
public sealed class ChrClassUIDisplayRecord public sealed class ChrClassUIDisplayRecord
{ {
public uint Id; public uint Id;
public byte ChrClassesID; public sbyte ChrClassesID;
public uint AdvGuidePlayerConditionID; public uint AdvGuidePlayerConditionID;
public uint SplashPlayerConditionID; public uint SplashPlayerConditionID;
} }
@@ -109,7 +110,6 @@ namespace Game.DataStorage
public string DisabledString; public string DisabledString;
public string HyphenatedNameMale; public string HyphenatedNameMale;
public string HyphenatedNameFemale; public string HyphenatedNameFemale;
public uint Id;
public uint CreateScreenFileDataID; public uint CreateScreenFileDataID;
public uint SelectScreenFileDataID; public uint SelectScreenFileDataID;
public uint IconFileDataID; public uint IconFileDataID;
@@ -128,6 +128,7 @@ namespace Game.DataStorage
public int CharacterCreationAnimLoopWaitTimeMsFallback; public int CharacterCreationAnimLoopWaitTimeMsFallback;
public ushort CinematicSequenceID; public ushort CinematicSequenceID;
public ushort DefaultSpec; public ushort DefaultSpec;
public uint Id;
public byte PrimaryStatPriority; public byte PrimaryStatPriority;
public PowerType DisplayPower; public PowerType DisplayPower;
public byte RangedAttackPowerPerAgility; public byte RangedAttackPowerPerAgility;
@@ -214,6 +215,7 @@ namespace Game.DataStorage
public string ReqSource; public string ReqSource;
public int Flags; public int Flags;
public int ClassMask; public int ClassMask;
public int RegionGroupMask;
public int AchievementID; public int AchievementID;
public int QuestID; public int QuestID;
public int OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar public int OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar
@@ -253,9 +255,9 @@ namespace Game.DataStorage
public sealed class ChrRaceXChrModelRecord public sealed class ChrRaceXChrModelRecord
{ {
public uint Id; public uint Id;
public uint ChrRacesID; public byte ChrRacesID;
public int ChrModelID; public int ChrModelID;
public int Sex; public sbyte Sex;
public int AllowedTransmogSlots; public int AllowedTransmogSlots;
} }
@@ -282,38 +284,37 @@ namespace Game.DataStorage
public uint CinematicSequenceID; public uint CinematicSequenceID;
public uint ResSicknessSpellID; public uint ResSicknessSpellID;
public int SplashSoundID; public int SplashSoundID;
public int Alliance;
public int RaceRelated;
public int UnalteredVisualRaceID;
public int DefaultClassID;
public int CreateScreenFileDataID; public int CreateScreenFileDataID;
public int SelectScreenFileDataID; public int SelectScreenFileDataID;
public int NeutralRaceID;
public int LowResScreenFileDataID; public int LowResScreenFileDataID;
public int[] AlteredFormStartVisualKitID = new int[3]; public int[] AlteredFormStartVisualKitID = new int[3];
public int[] AlteredFormFinishVisualKitID = new int[3]; public int[] AlteredFormFinishVisualKitID = new int[3];
public int HeritageArmorAchievementID; public int HeritageArmorAchievementID;
public int StartingLevel; public int StartingLevel;
public int UiDisplayOrder; public int UiDisplayOrder;
public int MaleModelFallbackRaceID;
public int FemaleModelFallbackRaceID;
public int MaleTextureFallbackRaceID;
public int FemaleTextureFallbackRaceID;
public int PlayableRaceBit; public int PlayableRaceBit;
public int HelmetAnimScalingRaceID;
public int TransmogrifyDisabledSlotMask; public int TransmogrifyDisabledSlotMask;
public int UnalteredVisualCustomizationRaceID;
public float[] AlteredFormCustomizeOffsetFallback = new float[3]; public float[] AlteredFormCustomizeOffsetFallback = new float[3];
public float AlteredFormCustomizeRotationFallback; public float AlteredFormCustomizeRotationFallback;
public float[] Unknown910_1 = new float[3]; public float[] Unknown910_1 = new float[3];
public float[] Unknown910_2 = new float[3]; public float[] Unknown910_2 = new float[3];
public int Unknown1000;
public sbyte BaseLanguage; public sbyte BaseLanguage;
public sbyte CreatureType; public byte CreatureType;
public sbyte Alliance;
public sbyte RaceRelated;
public sbyte UnalteredVisualRaceID;
public sbyte DefaultClassID;
public sbyte NeutralRaceID;
public sbyte MaleModelFallbackRaceID;
public sbyte MaleModelFallbackSex; public sbyte MaleModelFallbackSex;
public sbyte FemaleModelFallbackRaceID;
public sbyte FemaleModelFallbackSex; public sbyte FemaleModelFallbackSex;
public sbyte MaleTextureFallbackRaceID;
public sbyte MaleTextureFallbackSex; public sbyte MaleTextureFallbackSex;
public sbyte FemaleTextureFallbackRaceID;
public sbyte FemaleTextureFallbackSex; public sbyte FemaleTextureFallbackSex;
public sbyte HelmetAnimScalingRaceID;
public sbyte UnalteredVisualCustomizationRaceID;
public bool HasFlag(ChrRacesFlag chrRacesFlag) { return (Flags & (int)chrRacesFlag) != 0; } public bool HasFlag(ChrRacesFlag chrRacesFlag) { return (Flags & (int)chrRacesFlag) != 0; }
} }
@@ -488,7 +489,7 @@ namespace Game.DataStorage
public sbyte DisplayRaceID; public sbyte DisplayRaceID;
public sbyte DisplaySexID; public sbyte DisplaySexID;
public sbyte DisplayClassID; public sbyte DisplayClassID;
public sbyte Flags; public int Flags;
public int BakeMaterialResourcesID; public int BakeMaterialResourcesID;
public int HDBakeMaterialResourcesID; public int HDBakeMaterialResourcesID;
} }
@@ -559,7 +560,7 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public string Name; public string Name;
public byte Flags; public int Flags;
} }
public sealed class CriteriaRecord public sealed class CriteriaRecord
@@ -627,6 +628,7 @@ namespace Game.DataStorage
public uint RechargingAmountPerCycle; public uint RechargingAmountPerCycle;
public uint RechargingCycleDurationMS; public uint RechargingCycleDurationMS;
public float AccountTransferPercentage; public float AccountTransferPercentage;
public byte OrderIndex;
public int[] Flags = new int[2]; public int[] Flags = new int[2];
public bool HasFlag(CurrencyTypesFlags currencyTypesFlags) { return (Flags[0] & (int)currencyTypesFlags) != 0; } public bool HasFlag(CurrencyTypesFlags currencyTypesFlags) { return (Flags[0] & (int)currencyTypesFlags) != 0; }
+3 -3
View File
@@ -27,9 +27,9 @@ namespace Game.DataStorage
public sealed class EmotesTextSoundRecord public sealed class EmotesTextSoundRecord
{ {
public uint Id; public uint Id;
public byte RaceId; public sbyte RaceId;
public byte ClassId; public sbyte ClassId;
public byte SexId; public sbyte SexId;
public uint SoundId; public uint SoundId;
public uint EmotesTextId; public uint EmotesTextId;
} }
+2 -1
View File
@@ -161,7 +161,7 @@ namespace Game.DataStorage
public uint AllySlottingBroadcastTextID; public uint AllySlottingBroadcastTextID;
public byte ChrClassID; public byte ChrClassID;
public int Flags; public int Flags;
public byte Gender; public sbyte Gender;
public int AutoCombatantID; public int AutoCombatantID;
public int CovenantID; public int CovenantID;
} }
@@ -332,6 +332,7 @@ namespace Game.DataStorage
public int TraitTreeID; public int TraitTreeID;
public int ProfessionID; public int ProfessionID;
public int Unknown_1002_14; public int Unknown_1002_14;
public int SkillLineID;
} }
public sealed class GuildColorBackgroundRecord public sealed class GuildColorBackgroundRecord
+1 -1
View File
@@ -416,7 +416,7 @@ namespace Game.DataStorage
public byte DamageType; public byte DamageType;
public byte ContainerSlots; public byte ContainerSlots;
public byte RequiredPVPMedal; public byte RequiredPVPMedal;
public byte RequiredPVPRank; public sbyte RequiredPVPRank;
public sbyte RequiredLevel; public sbyte RequiredLevel;
public InventoryType inventoryType; public InventoryType inventoryType;
public sbyte OverallQualityID; public sbyte OverallQualityID;
@@ -53,6 +53,7 @@ namespace Game.DataStorage
public int LoreFileDataID; public int LoreFileDataID;
public int Flags; public int Flags;
public ushort AreaID; public ushort AreaID;
public ushort CovenantID;
} }
public sealed class JournalTierRecord public sealed class JournalTierRecord
+1 -1
View File
@@ -79,7 +79,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public string Name; public string Name;
public string[] Texture = new string[6]; public string[] Texture = new string[6];
public ushort Flags; public int Flags;
public byte SoundBank; // used to be "type", maybe needs fixing (works well for now) public byte SoundBank; // used to be "type", maybe needs fixing (works well for now)
public uint SoundID; public uint SoundID;
public uint SpellID; public uint SpellID;
@@ -211,6 +211,7 @@ namespace Game.DataStorage
public short ReqMapID; public short ReqMapID;
public int PlayerConditionID; public int PlayerConditionID;
public int FlightCapabilityID; public int FlightCapabilityID;
public int DriveCapabilityID;
public bool HasFlag(MountCapabilityFlags mountCapabilityFlags) { return (Flags & (int)mountCapabilityFlags) != 0; } public bool HasFlag(MountCapabilityFlags mountCapabilityFlags) { return (Flags & (int)mountCapabilityFlags) != 0; }
} }
+2 -2
View File
@@ -7,8 +7,8 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public string Name; public string Name;
public byte RaceID; public sbyte RaceID;
public byte Sex; public sbyte Sex;
} }
public sealed class NamesProfanityRecord public sealed class NamesProfanityRecord
+4 -4
View File
@@ -22,7 +22,7 @@ namespace Game.DataStorage
public byte Green; public byte Green;
public byte Blue; public byte Blue;
public byte Alpha; public byte Alpha;
public byte Flags; public int Flags;
} }
public sealed class PathNodeRecord public sealed class PathNodeRecord
@@ -85,7 +85,7 @@ namespace Game.DataStorage
public ushort WorldStateExpressionID; public ushort WorldStateExpressionID;
public int WeatherID; public int WeatherID;
public byte PartyStatus; public byte PartyStatus;
public byte LifetimeMaxPVPRank; public sbyte LifetimeMaxPVPRank;
public uint AchievementLogic; public uint AchievementLogic;
public sbyte Gender; public sbyte Gender;
public sbyte NativeGender; public sbyte NativeGender;
@@ -115,8 +115,8 @@ namespace Game.DataStorage
public byte MinGuildLevel; public byte MinGuildLevel;
public sbyte MaxExpansionTier; public sbyte MaxExpansionTier;
public sbyte MinExpansionTier; public sbyte MinExpansionTier;
public byte MinPVPRank; public sbyte MinPVPRank;
public byte MaxPVPRank; public sbyte MaxPVPRank;
public uint ContentTuningID; public uint ContentTuningID;
public int CovenantID; public int CovenantID;
public uint TraitNodeEntryLogic; public uint TraitNodeEntryLogic;
@@ -27,6 +27,7 @@ namespace Game.DataStorage
public uint QuestID; public uint QuestID;
public uint OrderIndex; public uint OrderIndex;
public int Flags; public int Flags;
public int Unknown1110;
} }
public sealed class QuestMoneyRewardRecord public sealed class QuestMoneyRewardRecord
+1 -1
View File
@@ -576,7 +576,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public string Name; public string Name;
public uint CreatureDisplayID; public uint CreatureDisplayID;
public sbyte CreatureType; public byte CreatureType;
public int Flags; public int Flags;
public int AttackIconFileID; public int AttackIconFileID;
public sbyte BonusActionBar; public sbyte BonusActionBar;
+1 -1
View File
@@ -20,7 +20,7 @@ namespace Game.DataStorage
public byte TierID; public byte TierID;
public byte Flags; public byte Flags;
public byte ColumnIndex; public byte ColumnIndex;
public byte ClassID; public sbyte ClassID;
public ushort SpecID; public ushort SpecID;
public uint SpellID; public uint SpellID;
public uint OverridesSpellID; public uint OverridesSpellID;
+2 -2
View File
@@ -28,7 +28,7 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public uint QuestFeedbackEffectID; public uint QuestFeedbackEffectID;
public byte WhenToDisplay; public int WhenToDisplay;
public byte TargetType; public byte TargetType;
public int TargetAsset; public int TargetAsset;
public uint PlayerConditionID; public uint PlayerConditionID;
@@ -48,7 +48,7 @@ namespace Game.DataStorage
public int HitRectLeft; public int HitRectLeft;
public int HitRectRight; public int HitRectRight;
public uint PlayerConditionID; public uint PlayerConditionID;
public uint Flags; public int Flags;
public uint[] AreaID = new uint[SharedConst.MaxWorldMapOverlayArea]; public uint[] AreaID = new uint[SharedConst.MaxWorldMapOverlayArea];
} }
+7 -4
View File
@@ -2945,7 +2945,7 @@ namespace Game.Entities
int scalingLevelMin = m_unitData.ScalingLevelMin; int scalingLevelMin = m_unitData.ScalingLevelMin;
int scalingLevelMax = m_unitData.ScalingLevelMax; int scalingLevelMax = m_unitData.ScalingLevelMax;
int scalingLevelDelta = m_unitData.ScalingLevelDelta; int scalingLevelDelta = m_unitData.ScalingLevelDelta;
int scalingFactionGroup = m_unitData.ScalingFactionGroup; byte scalingFactionGroup = m_unitData.ScalingFactionGroup;
uint targetLevel = unitTarget.m_unitData.EffectiveLevel; uint targetLevel = unitTarget.m_unitData.EffectiveLevel;
if (targetLevel == 0) if (targetLevel == 0)
targetLevel = unitTarget.GetLevel(); targetLevel = unitTarget.GetLevel();
@@ -3804,7 +3804,12 @@ namespace Game.Entities
m_unitData.WriteCreate(data, flags, this, target); m_unitData.WriteCreate(data, flags, this, target);
if (m_vendorData != null) if (m_vendorData != null)
{
if (EntityFragmentsHolder.IsIndirectFragment(EntityFragment.FVendor_C))
data.WriteUInt8(1); // IndirectFragmentActive: FVendor_C
m_vendorData.WriteCreate(data, flags, this, target); m_vendorData.WriteCreate(data, flags, this, target);
}
} }
public override void BuildValuesUpdate(WorldPacket data, UpdateFieldFlag flags, Player target) public override void BuildValuesUpdate(WorldPacket data, UpdateFieldFlag flags, Player target)
@@ -3869,9 +3874,7 @@ namespace Game.Entities
public override void ClearUpdateMask(bool remove) public override void ClearUpdateMask(bool remove)
{ {
if (m_vendorData != null) m_values.ClearChangesMask(m_vendorData);
m_values.ClearChangesMask(m_vendorData);
base.ClearUpdateMask(remove); base.ClearUpdateMask(remove);
} }
@@ -167,9 +167,9 @@ namespace Game.Entities
stats.Flags[0] = (uint)creatureDifficulty.TypeFlags; stats.Flags[0] = (uint)creatureDifficulty.TypeFlags;
stats.Flags[1] = creatureDifficulty.TypeFlags2; stats.Flags[1] = creatureDifficulty.TypeFlags2;
stats.CreatureType = (int)CreatureType; stats.CreatureType = (sbyte)CreatureType;
stats.CreatureFamily = (int)Family; stats.CreatureFamily = (int)Family;
stats.Classification = (int)Classification; stats.Classification = (sbyte)Classification;
for (uint i = 0; i < SharedConst.MaxCreatureKillCredit; ++i) for (uint i = 0; i < SharedConst.MaxCreatureKillCredit; ++i)
stats.ProxyCreatureID[i] = KillCredit[i]; stats.ProxyCreatureID[i] = KillCredit[i];
+4 -4
View File
@@ -17,7 +17,7 @@ namespace Game.Misc
public class GossipMenu public class GossipMenu
{ {
public uint AddMenuItem(int gossipOptionId, int orderIndex, GossipOptionNpc optionNpc, string optionText, uint language, public uint AddMenuItem(int gossipOptionId, int orderIndex, GossipOptionNpc optionNpc, string optionText, uint language,
GossipOptionFlags flags, int? gossipNpcOptionId, uint actionMenuId, uint actionPoiId, bool boxCoded, uint boxMoney, GossipOptionFlags flags, int? gossipNpcOptionId, uint actionMenuId, uint actionPoiId, bool boxCoded, ulong boxMoney,
string boxText, int? spellId, int? overrideIconId, uint sender, uint action) string boxText, int? spellId, int? overrideIconId, uint sender, uint action)
{ {
Cypher.Assert(_menuItems.Count <= SharedConst.MaxGossipMenuItems); Cypher.Assert(_menuItems.Count <= SharedConst.MaxGossipMenuItems);
@@ -261,7 +261,7 @@ namespace Game.Misc
opt.GossipOptionID = item.GossipOptionID; opt.GossipOptionID = item.GossipOptionID;
opt.OptionNPC = item.OptionNpc; opt.OptionNPC = item.OptionNpc;
opt.OptionFlags = (byte)(item.BoxCoded ? 1 : 0); // makes pop up box password opt.OptionFlags = (byte)(item.BoxCoded ? 1 : 0); // makes pop up box password
opt.OptionCost = (int)item.BoxMoney; // money required to open menu, 2.0.3 opt.OptionCost = item.BoxMoney; // money required to open menu, 2.0.3
opt.OptionLanguage = item.Language; opt.OptionLanguage = item.Language;
opt.Flags = item.Flags; opt.Flags = item.Flags;
opt.OrderIndex = (int)item.OrderIndex; opt.OrderIndex = (int)item.OrderIndex;
@@ -757,7 +757,7 @@ namespace Game.Misc
public GossipOptionFlags Flags; public GossipOptionFlags Flags;
public int? GossipNpcOptionID; public int? GossipNpcOptionID;
public bool BoxCoded; public bool BoxCoded;
public uint BoxMoney; public ulong BoxMoney;
public string BoxText; public string BoxText;
public int? SpellID; public int? SpellID;
public int? OverrideIconID; public int? OverrideIconID;
@@ -801,7 +801,7 @@ namespace Game.Misc
public uint ActionPoiID; public uint ActionPoiID;
public int? GossipNpcOptionID; public int? GossipNpcOptionID;
public bool BoxCoded; public bool BoxCoded;
public uint BoxMoney; public ulong BoxMoney;
public string BoxText; public string BoxText;
public uint BoxBroadcastTextId; public uint BoxBroadcastTextId;
public int? SpellID; public int? SpellID;
@@ -2355,7 +2355,7 @@ namespace Game.Entities
Player player = user.ToPlayer(); Player player = user.ToPlayer();
EnableBarberShop enableBarberShop = new(); EnableBarberShop enableBarberShop = new();
enableBarberShop.CustomizationScope = (byte)info.BarberChair.CustomizationScope; enableBarberShop.CustomizationFeatureMask = (byte)info.BarberChair.CustomizationFeatureMask;
player.SendPacket(enableBarberShop); player.SendPacket(enableBarberShop);
// fallback, will always work // fallback, will always work
@@ -1298,7 +1298,7 @@ namespace Game.Entities
public int HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0 public int HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0
public uint SitAnimKit; // 2 Sit Anim Kit, References: AnimKit, NoValue = 0 public uint SitAnimKit; // 2 Sit Anim Kit, References: AnimKit, NoValue = 0
public uint InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 public uint InteractRadiusOverride; // 3 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint CustomizationScope; // 4 Customization Scope, int, Min value: 0, Max value: 2147483647, Default value: 0 public uint CustomizationFeatureMask; // 4 Customization Feature Mask, int, Min value: 0, Max value: 2147483647, Default value: 0
public uint Preventteleportingtheplayeroutofthebarbershopchair;// 5 Prevent teleporting the player out of the barbershop chair, enum { false, true, }; Default: false public uint Preventteleportingtheplayeroutofthebarbershopchair;// 5 Prevent teleporting the player out of the barbershop chair, enum { false, true, }; Default: false
} }
@@ -1476,13 +1476,14 @@ namespace Game.Entities
public struct uilink public struct uilink
{ {
public uint UILinkType; // 0 UI Link Type, enum { Adventure Journal, Obliterum Forge, Scrapping Machine, Item Interaction }; Default: Adventure Journal public uint UILinkType; // 0 UI Link Type(Deprecated), enum { Adventure Journal, Obliterum Forge, Scrapping Machine, Item Interaction }; Default: Adventure Journal
public uint allowMounted; // 1 allowMounted, enum { false, true, }; Default: false public uint allowMounted; // 1 allowMounted, enum { false, true, }; Default: false
public uint GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false public uint GiganticAOI; // 2 Gigantic AOI, enum { false, true, }; Default: false
public uint spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0 public uint spellFocusType; // 3 spellFocusType, References: SpellFocusObject, NoValue = 0
public uint radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10 public uint radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10
public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0
public uint ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0 public uint ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0
public uint PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, PlaceholderType77, }; Default: None
} }
public struct keystonereceptacle public struct keystonereceptacle
File diff suppressed because it is too large Load Diff
@@ -33,7 +33,7 @@ namespace Game.Entities
FEntityLocalMatrix = 113, FEntityLocalMatrix = 113,
FEntityWorldMatrix = 114, FEntityWorldMatrix = 114,
CActor = 115, // INDIRECT, CActor = 115, // INDIRECT,
FVendor_C = 117, // UPDATEABLE, FVendor_C = 117, // UPDATEABLE, INDIRECT,
FMirroredObject_C = 119, FMirroredObject_C = 119,
End = 255, End = 255,
} }
@@ -84,7 +84,7 @@ namespace Game.Entities
Array.Sort(arr); Array.Sort(arr);
++count; ++count;
return (whereIndex, true); return (whereIndex, true);
}; }
if (!insertSorted(ref Ids, ref Count, fragment).Item2) if (!insertSorted(ref Ids, ref Count, fragment).Item2)
return; return;
@@ -103,7 +103,8 @@ namespace Game.Entities
if (IsIndirectFragment(UpdateableIds[i])) if (IsIndirectFragment(UpdateableIds[i]))
{ {
ContentsChangedMask |= UpdateableMasks[i]; // set the first bit to true to activate fragment ContentsChangedMask |= UpdateableMasks[i]; // set the first bit to true to activate fragment
UpdateableMasks[i] |= (byte)(1 << maskIndex++); ++maskIndex;
UpdateableMasks[i] <<= 1;
} }
} }
} }
@@ -125,7 +126,7 @@ namespace Game.Entities
return (where, true); return (where, true);
} }
return (where, false); return (where, false);
}; }
if (!removeSorted(ref Ids, ref Count, fragment).Item2) if (!removeSorted(ref Ids, ref Count, fragment).Item2)
return; return;
@@ -142,7 +143,10 @@ namespace Game.Entities
{ {
UpdateableMasks[i] = (byte)(1 << maskIndex++); UpdateableMasks[i] = (byte)(1 << maskIndex++);
if (IsIndirectFragment(UpdateableIds[i])) if (IsIndirectFragment(UpdateableIds[i]))
UpdateableMasks[i] |= (byte)(1 << maskIndex++); {
++maskIndex;
UpdateableMasks[i] <<= 1;
}
} }
} }
} }
@@ -157,7 +161,7 @@ namespace Game.Entities
public static bool IsIndirectFragment(EntityFragment frag) public static bool IsIndirectFragment(EntityFragment frag)
{ {
return frag == EntityFragment.CGObject || frag == EntityFragment.CActor; return frag == EntityFragment.CGObject || frag == EntityFragment.CActor || frag == EntityFragment.FVendor_C;
} }
public EntityFragment[] GetIds() { return Ids[..Count]; } public EntityFragment[] GetIds() { return Ids[..Count]; }
+48 -2
View File
@@ -249,9 +249,14 @@ namespace Game.Entities
public void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(WorldPacket data, UpdateFieldFlag flags) public void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(WorldPacket data, UpdateFieldFlag flags)
{ {
byte contentsChangedMask = EntityDefinitionsConst.CGObjectChangedMask;
foreach (var updateableFragmentId in m_entityFragments.GetUpdateableIds())
if (EntityFragmentsHolder.IsIndirectFragment(updateableFragmentId))
contentsChangedMask |= (byte)(m_entityFragments.GetUpdateMaskFor(updateableFragmentId) >> 1); // set the "fragment exists" bit
data.WriteUInt8((byte)(flags.HasFlag(UpdateFieldFlag.Owner) ? 1 : 0)); data.WriteUInt8((byte)(flags.HasFlag(UpdateFieldFlag.Owner) ? 1 : 0));
data.WriteUInt8(0); // m_entityFragments.IdsChanged data.WriteUInt8(0); // m_entityFragments.IdsChanged
data.WriteUInt8(EntityDefinitionsConst.CGObjectUpdateMask); data.WriteUInt8(contentsChangedMask);
} }
public void BuildDestroyUpdateBlock(UpdateData data) public void BuildDestroyUpdateBlock(UpdateData data)
@@ -319,6 +324,7 @@ namespace Game.Entities
bool HasSpline = unit.IsSplineEnabled(); bool HasSpline = unit.IsSplineEnabled();
bool HasInertia = unit.m_movementInfo.inertia.HasValue; bool HasInertia = unit.m_movementInfo.inertia.HasValue;
bool HasAdvFlying = unit.m_movementInfo.advFlying.HasValue; bool HasAdvFlying = unit.m_movementInfo.advFlying.HasValue;
bool HasDriveStatus = unit.m_movementInfo.driveStatus.HasValue;
bool HasStandingOnGameObjectGUID = unit.m_movementInfo.standingOnGameObjectGUID.HasValue; bool HasStandingOnGameObjectGUID = unit.m_movementInfo.standingOnGameObjectGUID.HasValue;
data.WritePackedGuid(GetGUID()); // MoverGUID data.WritePackedGuid(GetGUID()); // MoverGUID
@@ -349,6 +355,9 @@ namespace Game.Entities
data.WriteBit(false); // HeightChangeFailed data.WriteBit(false); // HeightChangeFailed
data.WriteBit(false); // RemoteTimeValid data.WriteBit(false); // RemoteTimeValid
data.WriteBit(HasInertia); // HasInertia data.WriteBit(HasInertia); // HasInertia
data.WriteBit(HasAdvFlying); // HasAdvFlying
data.WriteBit(HasDriveStatus); // HasDriveStatus
data.FlushBits();
if (!unit.m_movementInfo.transport.guid.IsEmpty()) if (!unit.m_movementInfo.transport.guid.IsEmpty())
MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport); MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport);
@@ -382,6 +391,14 @@ namespace Game.Entities
} }
} }
if (HasDriveStatus)
{
data.WriteBit(unit.m_movementInfo.driveStatus.Value.accelerating);
data.WriteBit(unit.m_movementInfo.driveStatus.Value.drifting);
data.WriteFloat(unit.m_movementInfo.driveStatus.Value.speed);
data.WriteFloat(unit.m_movementInfo.driveStatus.Value.movementAngle);
}
data.WriteFloat(unit.GetSpeed(UnitMoveType.Walk)); data.WriteFloat(unit.GetSpeed(UnitMoveType.Walk));
data.WriteFloat(unit.GetSpeed(UnitMoveType.Run)); data.WriteFloat(unit.GetSpeed(UnitMoveType.Run));
data.WriteFloat(unit.GetSpeed(UnitMoveType.RunBack)); data.WriteFloat(unit.GetSpeed(UnitMoveType.RunBack));
@@ -841,7 +858,6 @@ namespace Game.Entities
{ {
m_values.ClearChangesMask(m_objectData); m_values.ClearChangesMask(m_objectData);
m_entityFragments.IdsChanged = false; m_entityFragments.IdsChanged = false;
m_entityFragments.ContentsChangedMask = EntityDefinitionsConst.CGObjectActiveMask;
if (m_objectUpdated) if (m_objectUpdated)
{ {
@@ -3963,6 +3979,7 @@ namespace Game.Entities
public JumpInfo jump; public JumpInfo jump;
public float stepUpStartElevation { get; set; } public float stepUpStartElevation { get; set; }
public AdvFlying? advFlying; public AdvFlying? advFlying;
public Drive? driveStatus;
public ObjectGuid? standingOnGameObjectGUID; public ObjectGuid? standingOnGameObjectGUID;
public MovementInfo() public MovementInfo()
@@ -4027,12 +4044,14 @@ namespace Game.Entities
public uint prevTime; public uint prevTime;
public uint vehicleId; public uint vehicleId;
} }
public struct Inertia public struct Inertia
{ {
public int id; public int id;
public Position force; public Position force;
public uint lifetime; public uint lifetime;
} }
public struct JumpInfo public struct JumpInfo
{ {
public void Reset() public void Reset()
@@ -4047,12 +4066,21 @@ namespace Game.Entities
public float cosAngle; public float cosAngle;
public float xyspeed; public float xyspeed;
} }
// advflying // advflying
public struct AdvFlying public struct AdvFlying
{ {
public float forwardVelocity; public float forwardVelocity;
public float upVelocity; public float upVelocity;
} }
public struct Drive
{
public float speed;
public float movementAngle;
public bool accelerating;
public bool drifting;
}
} }
public class MovementForce public class MovementForce
@@ -4064,6 +4092,9 @@ namespace Game.Entities
public float Magnitude; public float Magnitude;
public MovementForceType Type; public MovementForceType Type;
public int MovementForceID; public int MovementForceID;
public int Unknown1110_1;
public int Unused1110;
public uint Flags;
public void Read(WorldPacket data) public void Read(WorldPacket data)
{ {
@@ -4073,6 +4104,9 @@ namespace Game.Entities
TransportID = data.ReadUInt32(); TransportID = data.ReadUInt32();
Magnitude = data.ReadFloat(); Magnitude = data.ReadFloat();
MovementForceID = data.ReadInt32(); MovementForceID = data.ReadInt32();
Unknown1110_1 = data.ReadInt32();
Unused1110 = data.ReadInt32();
Flags = data.ReadUInt32();
Type = (MovementForceType)data.ReadBits<byte>(2); Type = (MovementForceType)data.ReadBits<byte>(2);
} }
@@ -4264,7 +4298,13 @@ namespace Game.Entities
{ {
_owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit); _owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit);
if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject) if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject)
{
_changesMask.Reset(updateData.Bit); _changesMask.Reset(updateData.Bit);
if (!_changesMask.IsAnySet())
_owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit);
}
else
_owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit);
updateData.ClearChangesMask(); updateData.ClearChangesMask();
} }
@@ -4273,7 +4313,13 @@ namespace Game.Entities
{ {
_owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit); _owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit);
if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject) if ((EntityFragment)updateData._blockBit == EntityFragment.CGObject)
{
_changesMask.Reset(updateData.Bit); _changesMask.Reset(updateData.Bit);
if (!_changesMask.IsAnySet())
_owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit);
}
else
_owner.m_entityFragments.ContentsChangedMask &= (byte)~_owner.m_entityFragments.GetUpdateMaskFor((EntityFragment)updateData._blockBit);
if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U)))
((IHasChangesMask)updateField._value).ClearChangesMask(); ((IHasChangesMask)updateField._value).ClearChangesMask();
+1 -1
View File
@@ -162,7 +162,7 @@ namespace Game.Entities
data.Honor = honor; data.Honor = honor;
data.OriginalHonor = honor; data.OriginalHonor = honor;
data.Target = victim_guid; data.Target = victim_guid;
data.Rank = victim_rank; data.Rank = (sbyte)victim_rank;
SendPacket(data); SendPacket(data);
+7 -7
View File
@@ -853,7 +853,7 @@ namespace Game.Entities
Pet oldPet = GetPet(); Pet oldPet = GetPet();
if (oldPet != null && !oldPet.IsAlive()) if (oldPet != null && !oldPet.IsAlive())
{ {
sess.SendPetStableResult(StableResult.InternalError); sess.SendPetStableResult(StableResult.NoPet);
return; return;
} }
@@ -881,7 +881,7 @@ namespace Game.Entities
Pet oldPet = GetPet(); Pet oldPet = GetPet();
if (oldPet != null && !oldPet.IsAlive()) if (oldPet != null && !oldPet.IsAlive())
{ {
sess.SendPetStableResult(StableResult.InternalError); sess.SendPetStableResult(StableResult.NoPet);
return; return;
} }
@@ -2813,7 +2813,7 @@ namespace Game.Entities
} }
} }
long cost = item.BoxMoney; long cost = (long)item.BoxMoney;
if (!HasEnoughMoney(cost)) if (!HasEnoughMoney(cost))
{ {
SendBuyError(BuyResult.NotEnoughtMoney, null, 0); SendBuyError(BuyResult.NotEnoughtMoney, null, 0);
@@ -2968,7 +2968,7 @@ namespace Game.Entities
PlayerInteractionType.ProfessionsCraftingOrder, PlayerInteractionType.Professions, PlayerInteractionType.ProfessionsCustomerOrder, PlayerInteractionType.ProfessionsCraftingOrder, PlayerInteractionType.Professions, PlayerInteractionType.ProfessionsCustomerOrder,
PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown, PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown,
PlayerInteractionType.PersonalTabardVendor, PlayerInteractionType.ForgeMaster, PlayerInteractionType.CharacterBanker, PlayerInteractionType.PersonalTabardVendor, PlayerInteractionType.ForgeMaster, PlayerInteractionType.CharacterBanker,
PlayerInteractionType.AccountBanker PlayerInteractionType.AccountBanker, PlayerInteractionType.ProfessionRespec
}; };
PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc]; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc];
@@ -5938,8 +5938,8 @@ namespace Game.Entities
PlayerLevelInfo info = ObjectMgr.GetPlayerLevelInfo(GetRace(), GetClass(), GetLevel()); PlayerLevelInfo info = ObjectMgr.GetPlayerLevelInfo(GetRace(), GetClass(), GetLevel());
int exp_max_lvl = (int)ObjectMgr.GetMaxLevelForExpansion(GetSession().GetExpansion()); uint exp_max_lvl = ObjectMgr.GetMaxLevelForExpansion(GetSession().GetExpansion());
int conf_max_lvl = WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel); uint conf_max_lvl = WorldConfig.GetUIntValue(WorldCfg.MaxPlayerLevel);
if (exp_max_lvl == SharedConst.DefaultMaxLevel || exp_max_lvl >= conf_max_lvl) if (exp_max_lvl == SharedConst.DefaultMaxLevel || exp_max_lvl >= conf_max_lvl)
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MaxLevel), conf_max_lvl); SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.MaxLevel), conf_max_lvl);
else else
@@ -8023,7 +8023,7 @@ namespace Game.Entities
{ {
PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, false, 0, "", null, null, sender, action); PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, false, 0, "", null, null, sender, action);
} }
public void AddGossipItem(GossipOptionNpc optionNpc, string text, uint sender, uint action, string popupText, uint popupMoney, bool coded) public void AddGossipItem(GossipOptionNpc optionNpc, string text, uint sender, uint action, string popupText, ulong popupMoney, bool coded)
{ {
PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, coded, popupMoney, popupText, null, null, sender, action); PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, coded, popupMoney, popupText, null, null, sender, action);
} }
+1 -1
View File
@@ -516,7 +516,7 @@ namespace Game.Garrisons
public void SendInfo() public void SendInfo()
{ {
GetGarrisonInfoResult garrisonInfo = new(); GetGarrisonInfoResult garrisonInfo = new();
garrisonInfo.FactionIndex = GetFaction(); garrisonInfo.FactionIndex = (sbyte)GetFaction();
GarrisonInfo garrison = new(); GarrisonInfo garrison = new();
garrison.GarrTypeID = GetGarrisonType(); garrison.GarrTypeID = GetGarrisonType();
+1 -1
View File
@@ -567,7 +567,7 @@ namespace Game
gMenuItem.GossipNpcOptionID = result.Read<int>(10); gMenuItem.GossipNpcOptionID = result.Read<int>(10);
gMenuItem.BoxCoded = result.Read<bool>(11); gMenuItem.BoxCoded = result.Read<bool>(11);
gMenuItem.BoxMoney = result.Read<uint>(12); gMenuItem.BoxMoney = result.Read<ulong>(12);
gMenuItem.BoxText = result.Read<string>(13); gMenuItem.BoxText = result.Read<string>(13);
gMenuItem.BoxBroadcastTextId = result.Read<uint>(14); gMenuItem.BoxBroadcastTextId = result.Read<uint>(14);
if (!result.IsNull(15)) if (!result.IsNull(15))
+1
View File
@@ -995,6 +995,7 @@ namespace Game
AuctionHelloResponse auctionHelloResponse = new(); AuctionHelloResponse auctionHelloResponse = new();
auctionHelloResponse.Auctioneer = guid; auctionHelloResponse.Auctioneer = guid;
auctionHelloResponse.AuctionHouseID = ahEntry.Id;
auctionHelloResponse.OpenForBusiness = true; auctionHelloResponse.OpenForBusiness = true;
SendPacket(auctionHelloResponse); SendPacket(auctionHelloResponse);
} }
+1 -1
View File
@@ -115,7 +115,7 @@ namespace Game
foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements())
{ {
EnumCharactersResult.RaceUnlock raceUnlock = new(); EnumCharactersResult.RaceUnlock raceUnlock = new();
raceUnlock.RaceID = requirement.Key; raceUnlock.RaceID = (sbyte)requirement.Key;
raceUnlock.HasUnlockedLicense = (byte)GetAccountExpansion() >= requirement.Value.Expansion; raceUnlock.HasUnlockedLicense = (byte)GetAccountExpansion() >= requirement.Value.Expansion;
raceUnlock.HasUnlockedAchievement = requirement.Value.AchievementId != 0 && (WorldConfig.GetBoolValue(WorldCfg.CharacterCreatingDisableAlliedRaceAchievementRequirement) raceUnlock.HasUnlockedAchievement = requirement.Value.AchievementId != 0 && (WorldConfig.GetBoolValue(WorldCfg.CharacterCreatingDisableAlliedRaceAchievementRequirement)
/* || HasAccountAchievement(requirement.second.AchievementId)*/); /* || HasAccountAchievement(requirement.second.AchievementId)*/);
@@ -27,6 +27,7 @@ namespace Game
break; break;
} }
case ItemCollectionType.TransmogSetFavorite: case ItemCollectionType.TransmogSetFavorite:
case ItemCollectionType.WarbandScene:
break; break;
default: default:
break; break;
+8 -2
View File
@@ -354,9 +354,15 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.SetPetSlot)] [WorldPacketHandler(ClientOpcodes.SetPetSlot)]
void HandleSetPetSlot(SetPetSlot setPetSlot) void HandleSetPetSlot(SetPetSlot setPetSlot)
{ {
if (!CheckStableMaster(setPetSlot.StableMaster) || setPetSlot.DestSlot >= (byte)PetSaveMode.LastStableSlot) if (!CheckStableMaster(setPetSlot.StableMaster))
{ {
SendPetStableResult(StableResult.InternalError); SendPetStableResult(StableResult.NotStableMaster);
return;
}
if (setPetSlot.DestSlot >= (byte)PetSaveMode.LastStableSlot)
{
SendPetStableResult(StableResult.InvalidSlot);
return; return;
} }
@@ -34,7 +34,7 @@ namespace Game.Networking.Packets
MinLevel = _worldPacket.ReadUInt8(); MinLevel = _worldPacket.ReadUInt8();
MaxLevel = _worldPacket.ReadUInt8(); MaxLevel = _worldPacket.ReadUInt8();
Unused1007_1 = _worldPacket.ReadUInt8(); Unused1007_1 = _worldPacket.ReadUInt8();
Unused1007_2= _worldPacket.ReadUInt8(); Unused1007_2 = _worldPacket.ReadUInt8();
Filters = (AuctionHouseFilterMask)_worldPacket.ReadUInt32(); Filters = (AuctionHouseFilterMask)_worldPacket.ReadUInt32();
uint knownPetSize = _worldPacket.ReadUInt32(); uint knownPetSize = _worldPacket.ReadUInt32();
MaxPetLevel = _worldPacket.ReadInt8(); MaxPetLevel = _worldPacket.ReadInt8();
@@ -133,8 +133,8 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
Auctioneer = _worldPacket.ReadPackedGuid(); Auctioneer = _worldPacket.ReadPackedGuid();
Offset = _worldPacket.ReadUInt32(); Offset = _worldPacket.ReadUInt32();
if (_worldPacket.HasBit()) if (_worldPacket.HasBit())
TaintedBy = new(); TaintedBy = new();
@@ -270,7 +270,7 @@ namespace Game.Networking.Packets
} }
class AuctionPlaceBid : ClientPacket class AuctionPlaceBid : ClientPacket
{ {
public ObjectGuid Auctioneer; public ObjectGuid Auctioneer;
public ulong BidAmount; public ulong BidAmount;
public uint AuctionID; public uint AuctionID;
@@ -341,7 +341,7 @@ namespace Game.Networking.Packets
} }
} }
} }
class AuctionSellCommodity : ClientPacket class AuctionSellCommodity : ClientPacket
{ {
public ObjectGuid Auctioneer; public ObjectGuid Auctioneer;
@@ -402,7 +402,7 @@ namespace Game.Networking.Packets
} }
class AuctionSetFavoriteItem : ClientPacket class AuctionSetFavoriteItem : ClientPacket
{ {
public AuctionFavoriteInfo Item; public AuctionFavoriteInfo Item;
public bool IsNotFavorite = true; public bool IsNotFavorite = true;
@@ -439,7 +439,7 @@ namespace Game.Networking.Packets
} }
class AuctionClosedNotification : ServerPacket class AuctionClosedNotification : ServerPacket
{ {
public AuctionOwnerNotification Info; public AuctionOwnerNotification Info;
public float ProceedsMailDelay; public float ProceedsMailDelay;
public bool Sold = true; public bool Sold = true;
@@ -456,7 +456,7 @@ namespace Game.Networking.Packets
} }
class AuctionCommandResult : ServerPacket class AuctionCommandResult : ServerPacket
{ {
public uint AuctionID; ///< the id of the auction that triggered this notification public uint AuctionID; ///< the id of the auction that triggered this notification
public int Command; ///< the type of action that triggered this notification. Possible values are @ref AuctionAction public int Command; ///< the type of action that triggered this notification. Possible values are @ref AuctionAction
public int ErrorCode; ///< the error code that was generated when trying to perform the action. Possible values are @ref AuctionError public int ErrorCode; ///< the error code that was generated when trying to perform the action. Possible values are @ref AuctionError
@@ -515,6 +515,7 @@ namespace Game.Networking.Packets
public ObjectGuid Auctioneer; public ObjectGuid Auctioneer;
public uint PurchaseDeliveryDelay; public uint PurchaseDeliveryDelay;
public uint CancelDeliveryDelay; public uint CancelDeliveryDelay;
public uint AuctionHouseID;
public bool OpenForBusiness = true; public bool OpenForBusiness = true;
public AuctionHelloResponse() : base(ServerOpcodes.AuctionHelloResponse) { } public AuctionHelloResponse() : base(ServerOpcodes.AuctionHelloResponse) { }
@@ -524,13 +525,14 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(Auctioneer); _worldPacket.WritePackedGuid(Auctioneer);
_worldPacket.WriteUInt32(PurchaseDeliveryDelay); _worldPacket.WriteUInt32(PurchaseDeliveryDelay);
_worldPacket.WriteUInt32(CancelDeliveryDelay); _worldPacket.WriteUInt32(CancelDeliveryDelay);
_worldPacket.WriteUInt32(AuctionHouseID);
_worldPacket.WriteBit(OpenForBusiness); _worldPacket.WriteBit(OpenForBusiness);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
} }
public class AuctionListBiddedItemsResult : ServerPacket public class AuctionListBiddedItemsResult : ServerPacket
{ {
public List<AuctionItem> Items = new(); public List<AuctionItem> Items = new();
public uint DesiredDelay; public uint DesiredDelay;
public bool HasMoreResults; public bool HasMoreResults;
@@ -550,7 +552,7 @@ namespace Game.Networking.Packets
} }
public class AuctionListBucketsResult : ServerPacket public class AuctionListBucketsResult : ServerPacket
{ {
public List<BucketInfo> Buckets = new(); public List<BucketInfo> Buckets = new();
public uint DesiredDelay; public uint DesiredDelay;
public int Unknown830_0; public int Unknown830_0;
@@ -576,7 +578,7 @@ namespace Game.Networking.Packets
} }
class AuctionFavoriteList : ServerPacket class AuctionFavoriteList : ServerPacket
{ {
public uint DesiredDelay; public uint DesiredDelay;
public List<AuctionFavoriteInfo> Items = new(); public List<AuctionFavoriteInfo> Items = new();
@@ -623,7 +625,7 @@ namespace Game.Networking.Packets
} }
public class AuctionListOwnedItemsResult : ServerPacket public class AuctionListOwnedItemsResult : ServerPacket
{ {
public List<AuctionItem> Items = new(); public List<AuctionItem> Items = new();
public List<AuctionItem> SoldItems = new(); public List<AuctionItem> SoldItems = new();
public uint DesiredDelay; public uint DesiredDelay;
@@ -648,7 +650,7 @@ namespace Game.Networking.Packets
} }
class AuctionOutbidNotification : ServerPacket class AuctionOutbidNotification : ServerPacket
{ {
public AuctionBidderNotification Info; public AuctionBidderNotification Info;
public ulong BidAmount; public ulong BidAmount;
public ulong MinIncrement; public ulong MinIncrement;
@@ -664,7 +666,7 @@ namespace Game.Networking.Packets
} }
class AuctionOwnerBidNotification : ServerPacket class AuctionOwnerBidNotification : ServerPacket
{ {
public AuctionOwnerNotification Info; public AuctionOwnerNotification Info;
public ObjectGuid Bidder; public ObjectGuid Bidder;
public ulong MinIncrement; public ulong MinIncrement;
@@ -680,7 +682,7 @@ namespace Game.Networking.Packets
} }
public class AuctionReplicateResponse : ServerPacket public class AuctionReplicateResponse : ServerPacket
{ {
public uint ChangeNumberCursor; public uint ChangeNumberCursor;
public uint ChangeNumberGlobal; public uint ChangeNumberGlobal;
public uint DesiredDelay; public uint DesiredDelay;
@@ -705,7 +707,7 @@ namespace Game.Networking.Packets
} }
class AuctionWonNotification : ServerPacket class AuctionWonNotification : ServerPacket
{ {
public AuctionBidderNotification Info; public AuctionBidderNotification Info;
public AuctionWonNotification() : base(ServerOpcodes.AuctionWonNotification) { } public AuctionWonNotification() : base(ServerOpcodes.AuctionWonNotification) { }
@@ -791,7 +793,7 @@ namespace Game.Networking.Packets
ItemClass = data.ReadInt32(); ItemClass = data.ReadInt32();
uint subClassFilterCount = data.ReadBits<uint>(5); uint subClassFilterCount = data.ReadBits<uint>(5);
for (var i = 0; i < subClassFilterCount; ++i) for (var i = 0; i < subClassFilterCount; ++i)
SubClassFilters[i] = new AuctionListFilterSubClass(data); SubClassFilters[i] = new AuctionListFilterSubClass(data);
} }
} }
@@ -944,6 +946,7 @@ namespace Game.Networking.Packets
public ObjectGuid ItemGuid; public ObjectGuid ItemGuid;
public ObjectGuid OwnerAccountID; public ObjectGuid OwnerAccountID;
public uint EndTime; public uint EndTime;
public uint Unused1110;
public ObjectGuid? Bidder; public ObjectGuid? Bidder;
public ulong? BidAmount; public ulong? BidAmount;
public List<ItemGemData> Gems = new(); public List<ItemGemData> Gems = new();
@@ -981,6 +984,7 @@ namespace Game.Networking.Packets
data.WritePackedGuid(Owner); data.WritePackedGuid(Owner);
data.WriteInt32(DurationLeft); data.WriteInt32(DurationLeft);
data.WriteUInt8(DeleteReason); data.WriteUInt8(DeleteReason);
data.WriteUInt32(Unused1110);
foreach (ItemEnchantData enchant in Enchantments) foreach (ItemEnchantData enchant in Enchantments)
enchant.Write(data); enchant.Write(data);
@@ -1026,12 +1030,14 @@ namespace Game.Networking.Packets
struct AuctionBidderNotification struct AuctionBidderNotification
{ {
public uint AuctionHouseID;
public uint AuctionID; public uint AuctionID;
public ObjectGuid Bidder; public ObjectGuid Bidder;
public ItemInstance Item; public ItemInstance Item;
public void Initialize(AuctionPosting auction, Item item) public void Initialize(uint auctionHouseId, AuctionPosting auction, Item item)
{ {
AuctionHouseID = auctionHouseId;
AuctionID = auction.Id; AuctionID = auction.Id;
Item = new ItemInstance(item); Item = new ItemInstance(item);
Bidder = auction.Bidder; Bidder = auction.Bidder;
@@ -1039,6 +1045,7 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt32(AuctionHouseID);
data.WriteUInt32(AuctionID); data.WriteUInt32(AuctionID);
data.WritePackedGuid(Bidder); data.WritePackedGuid(Bidder);
Item.Write(data); Item.Write(data);
@@ -371,6 +371,7 @@ namespace Game.Networking.Packets
class EnterEncryptedMode : ServerPacket class EnterEncryptedMode : ServerPacket
{ {
byte[] EncryptionKey; byte[] EncryptionKey;
int RegionGroup;
bool Enabled; bool Enabled;
static byte[] expandedPrivateKey; static byte[] expandedPrivateKey;
@@ -404,6 +405,7 @@ namespace Game.Networking.Packets
toSign.Finish(EnableEncryptionSeed, 16); toSign.Finish(EnableEncryptionSeed, 16);
_worldPacket.WriteBytes(Ed25519.Sign(toSign.Digest, expandedPrivateKey, 0, EnableEncryptionContext)); _worldPacket.WriteBytes(Ed25519.Sign(toSign.Digest, expandedPrivateKey, 0, EnableEncryptionContext));
_worldPacket.WriteInt32(RegionGroup);
_worldPacket.WriteBit(Enabled); _worldPacket.WriteBit(Enabled);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
@@ -416,7 +418,7 @@ namespace Game.Networking.Packets
{ {
data.WriteUInt32(WaitCount); data.WriteUInt32(WaitCount);
data.WriteUInt32(WaitTime); data.WriteUInt32(WaitTime);
data.WriteUInt32(AllowedFactionGroupForCharacterCreate); data.WriteUInt8(AllowedFactionGroupForCharacterCreate);
data.WriteBit(HasFCM); data.WriteBit(HasFCM);
data.WriteBit(CanCreateOnlyIfExisting); data.WriteBit(CanCreateOnlyIfExisting);
data.FlushBits(); data.FlushBits();
@@ -424,7 +426,7 @@ namespace Game.Networking.Packets
public uint WaitCount; // position of the account in the login queue public uint WaitCount; // position of the account in the login queue
public uint WaitTime; // Wait time in login queue in minutes, if sent queued and this value is 0 client displays "unknown time" public uint WaitTime; // Wait time in login queue in minutes, if sent queued and this value is 0 client displays "unknown time"
public uint AllowedFactionGroupForCharacterCreate; public byte AllowedFactionGroupForCharacterCreate;
public bool HasFCM; // true if the account has a forced character migration pending. @todo implement public bool HasFCM; // true if the account has a forced character migration pending. @todo implement
public bool CanCreateOnlyIfExisting; ///< Can create characters on realm only if player has other existing characters there public bool CanCreateOnlyIfExisting; ///< Can create characters on realm only if player has other existing characters there
} }
@@ -144,7 +144,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Mapid); _worldPacket.WriteUInt32(Mapid);
_worldPacket.WriteUInt32(ShutdownTimer); _worldPacket.WriteUInt32(ShutdownTimer);
_worldPacket.WriteUInt32(StartTimer); _worldPacket.WriteUInt32(StartTimer);
_worldPacket.WriteBit(ArenaFaction != 0); _worldPacket.WriteInt8(ArenaFaction);
_worldPacket.WriteBit(LeftEarly); _worldPacket.WriteBit(LeftEarly);
_worldPacket.WriteBit(Brawl); _worldPacket.WriteBit(Brawl);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -152,7 +152,7 @@ namespace Game.Networking.Packets
public BattlefieldStatusHeader Hdr = new(); public BattlefieldStatusHeader Hdr = new();
public uint ShutdownTimer; public uint ShutdownTimer;
public byte ArenaFaction; public sbyte ArenaFaction;
public bool LeftEarly; public bool LeftEarly;
public bool Brawl; public bool Brawl;
public uint StartTimer; public uint StartTimer;
@@ -704,13 +704,14 @@ namespace Game.Networking.Packets
{ {
data.WritePackedGuid(PlayerGUID); data.WritePackedGuid(PlayerGUID);
data.WriteUInt32(Kills); data.WriteUInt32(Kills);
data.WriteInt32(Faction);
data.WriteUInt32(DamageDone); data.WriteUInt32(DamageDone);
data.WriteUInt32(HealingDone); data.WriteUInt32(HealingDone);
data.WriteInt32(Stats.Count); data.WriteInt32(Stats.Count);
data.WriteInt32(PrimaryTalentTree); data.WriteInt32(PrimaryTalentTree);
data.WriteInt8(Sex); data.WriteInt8(Sex);
data.WriteUInt32((uint)PlayerRace); data.WriteInt8(PlayerRace);
data.WriteInt32(PlayerClass); data.WriteInt8(PlayerClass);
data.WriteInt32(CreatureID); data.WriteInt32(CreatureID);
data.WriteInt32(HonorLevel); data.WriteInt32(HonorLevel);
data.WriteInt32(Role); data.WriteInt32(Role);
@@ -718,7 +719,6 @@ namespace Game.Networking.Packets
foreach (var pvpStat in Stats) foreach (var pvpStat in Stats)
pvpStat.Write(data); pvpStat.Write(data);
data.WriteBit(Faction != 0);
data.WriteBit(IsInWorld); data.WriteBit(IsInWorld);
data.WriteBit(Honor.HasValue); data.WriteBit(Honor.HasValue);
data.WriteBit(PreMatchRating.HasValue); data.WriteBit(PreMatchRating.HasValue);
@@ -749,7 +749,7 @@ namespace Game.Networking.Packets
public ObjectGuid PlayerGUID; public ObjectGuid PlayerGUID;
public uint Kills; public uint Kills;
public byte Faction; public int Faction;
public bool IsInWorld; public bool IsInWorld;
public HonorData? Honor; public HonorData? Honor;
public uint DamageDone; public uint DamageDone;
@@ -762,8 +762,8 @@ namespace Game.Networking.Packets
public List<PVPMatchPlayerPVPStat> Stats = new(); public List<PVPMatchPlayerPVPStat> Stats = new();
public int PrimaryTalentTree; public int PrimaryTalentTree;
public sbyte Sex; public sbyte Sex;
public Race PlayerRace; public sbyte PlayerRace;
public int PlayerClass; public sbyte PlayerClass;
public int CreatureID; public int CreatureID;
public int HonorLevel; public int HonorLevel;
public int Role; public int Role;
@@ -52,9 +52,6 @@ namespace Game.Networking.Packets
foreach (RaceLimitDisableInfo raceLimitDisableInfo in RaceLimitDisables) foreach (RaceLimitDisableInfo raceLimitDisableInfo in RaceLimitDisables)
raceLimitDisableInfo.Write(_worldPacket); raceLimitDisableInfo.Write(_worldPacket);
foreach (WarbandGroup warbandGroup in WarbandGroups)
warbandGroup.Write(_worldPacket);
foreach (CharacterInfo charInfo in Characters) foreach (CharacterInfo charInfo in Characters)
charInfo.Write(_worldPacket); charInfo.Write(_worldPacket);
@@ -63,6 +60,9 @@ namespace Game.Networking.Packets
foreach (RaceUnlock raceUnlock in RaceUnlockData) foreach (RaceUnlock raceUnlock in RaceUnlockData)
raceUnlock.Write(_worldPacket); raceUnlock.Write(_worldPacket);
foreach (WarbandGroup warbandGroup in WarbandGroups)
warbandGroup.Write(_worldPacket);
} }
public bool Success; public bool Success;
@@ -197,6 +197,7 @@ namespace Game.Networking.Packets
data.WriteUInt32((uint)Flags); data.WriteUInt32((uint)Flags);
data.WriteUInt32((uint)Flags2); data.WriteUInt32((uint)Flags2);
data.WriteUInt32(Flags3); data.WriteUInt32(Flags3);
data.WriteUInt32(Flags4);
data.WriteUInt8(CantLoginReason); data.WriteUInt8(CantLoginReason);
data.WriteUInt32(PetCreatureDisplayId); data.WriteUInt32(PetCreatureDisplayId);
@@ -216,6 +217,7 @@ namespace Game.Networking.Packets
data.WriteInt32(TimerunningSeasonID); data.WriteInt32(TimerunningSeasonID);
data.WriteUInt32(OverrideSelectScreenFileDataID); data.WriteUInt32(OverrideSelectScreenFileDataID);
data.WriteUInt32(Unused1110_1);
foreach (ChrCustomizationChoice customization in Customizations) foreach (ChrCustomizationChoice customization in Customizations)
{ {
@@ -225,6 +227,8 @@ namespace Game.Networking.Packets
data.WriteBits(Name.GetByteCount(), 6); data.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin); data.WriteBit(FirstLogin);
data.WriteBit(Unused1110_2);
data.WriteBit(Unused1110_3);
data.FlushBits(); data.FlushBits();
data.WriteString(Name); data.WriteString(Name);
@@ -247,6 +251,7 @@ namespace Game.Networking.Packets
public CharacterFlags Flags; // Character flag @see enum CharacterFlags public CharacterFlags Flags; // Character flag @see enum CharacterFlags
public CharacterCustomizeFlags Flags2; // Character customization flags @see enum CharacterCustomizeFlags public CharacterCustomizeFlags Flags2; // Character customization flags @see enum CharacterCustomizeFlags
public uint Flags3; // Character flags 3 @todo research public uint Flags3; // Character flags 3 @todo research
public uint Flags4; ///< Character flags 4 @todo research
public bool FirstLogin; public bool FirstLogin;
public byte CantLoginReason; public byte CantLoginReason;
public long LastActiveTime; public long LastActiveTime;
@@ -261,6 +266,9 @@ namespace Game.Networking.Packets
public uint[] ProfessionIds = new uint[2]; // @todo public uint[] ProfessionIds = new uint[2]; // @todo
public VisualItemInfo[] VisualItems = new VisualItemInfo[19]; public VisualItemInfo[] VisualItems = new VisualItemInfo[19];
public CustomTabardInfo PersonalTabard = new(); public CustomTabardInfo PersonalTabard = new();
public uint Unused1110_1;
public bool Unused1110_2;
public bool Unused1110_3;
public struct VisualItemInfo public struct VisualItemInfo
{ {
@@ -350,6 +358,7 @@ namespace Game.Networking.Packets
{ {
public CharacterInfoBasic Basic; public CharacterInfoBasic Basic;
public ulong Money; public ulong Money;
public float AvgEquippedItemLevel;
public float CurrentSeasonMythicPlusOverallScore; public float CurrentSeasonMythicPlusOverallScore;
public uint CurrentSeasonBestPvpRating; public uint CurrentSeasonBestPvpRating;
public sbyte PvpRatingBracket; public sbyte PvpRatingBracket;
@@ -364,6 +373,7 @@ namespace Game.Networking.Packets
{ {
Basic.Write(data); Basic.Write(data);
data.WriteUInt64(Money); data.WriteUInt64(Money);
data.WriteFloat(AvgEquippedItemLevel);
data.WriteFloat(CurrentSeasonMythicPlusOverallScore); data.WriteFloat(CurrentSeasonMythicPlusOverallScore);
data.WriteUInt32(CurrentSeasonBestPvpRating); data.WriteUInt32(CurrentSeasonBestPvpRating);
data.WriteInt8(PvpRatingBracket); data.WriteInt8(PvpRatingBracket);
@@ -373,7 +383,7 @@ namespace Game.Networking.Packets
public struct RaceUnlock public struct RaceUnlock
{ {
public int RaceID; public sbyte RaceID;
public bool HasUnlockedLicense; public bool HasUnlockedLicense;
public bool HasUnlockedAchievement; public bool HasUnlockedAchievement;
public bool HasHeritageArmorUnlockAchievement; public bool HasHeritageArmorUnlockAchievement;
@@ -382,7 +392,7 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteInt32(RaceID); data.WriteInt8(RaceID);
data.WriteBit(HasUnlockedLicense); data.WriteBit(HasUnlockedLicense);
data.WriteBit(HasUnlockedAchievement); data.WriteBit(HasUnlockedAchievement);
data.WriteBit(HasHeritageArmorUnlockAchievement); data.WriteBit(HasHeritageArmorUnlockAchievement);
@@ -406,12 +416,12 @@ namespace Game.Networking.Packets
public struct RaceLimitDisableInfo public struct RaceLimitDisableInfo
{ {
public int RaceID; public sbyte RaceID;
public int Reason; public int Reason;
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteInt32(RaceID); data.WriteInt8(RaceID);
data.WriteInt32(Reason); data.WriteInt32(Reason);
} }
} }
@@ -966,9 +976,9 @@ namespace Game.Networking.Packets
{ {
var customizationCount = _worldPacket.ReadUInt32(); var customizationCount = _worldPacket.ReadUInt32();
NewSex = _worldPacket.ReadUInt8(); NewSex = _worldPacket.ReadUInt8();
CustomizedRace = _worldPacket.ReadInt32(); CustomizedRace = _worldPacket.ReadInt8();
CustomizedChrModelID = _worldPacket.ReadInt32(); CustomizedChrModelID = _worldPacket.ReadInt32();
UnalteredVisualRaceID = _worldPacket.ReadInt32(); UnalteredVisualRaceID = _worldPacket.ReadInt8();
for (var i = 0; i < customizationCount; ++i) for (var i = 0; i < customizationCount; ++i)
{ {
@@ -984,9 +994,9 @@ namespace Game.Networking.Packets
public byte NewSex; public byte NewSex;
public Array<ChrCustomizationChoice> Customizations = new(250); public Array<ChrCustomizationChoice> Customizations = new(250);
public int CustomizedRace; public sbyte CustomizedRace;
public int CustomizedChrModelID; public int CustomizedChrModelID;
public int UnalteredVisualRaceID; public sbyte UnalteredVisualRaceID;
} }
public class BarberShopResult : ServerPacket public class BarberShopResult : ServerPacket
@@ -1301,13 +1311,13 @@ namespace Game.Networking.Packets
public struct WarbandGroupMember public struct WarbandGroupMember
{ {
public int WarbandScenePlacementID; public uint WarbandScenePlacementID;
public int Type; public int Type;
public ObjectGuid Guid; public ObjectGuid Guid;
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteInt32(WarbandScenePlacementID); data.WriteUInt32(WarbandScenePlacementID);
data.WriteInt32(Type); data.WriteInt32(Type);
if (Type == 0) if (Type == 0)
data.WritePackedGuid(Guid); data.WritePackedGuid(Guid);
@@ -1317,19 +1327,27 @@ namespace Game.Networking.Packets
public class WarbandGroup public class WarbandGroup
{ {
public ulong GroupID; public ulong GroupID;
public byte Unknown_1100; public byte OrderIndex;
public int Flags; ///< enum WarbandGroupFlags { Collapsed = 1 } public uint WarbandSceneID;
public uint Flags; ///< enum WarbandGroupFlags { Collapsed = 1 }
public List<WarbandGroupMember> Members = new(); public List<WarbandGroupMember> Members = new();
public string Name = "";
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt64(GroupID); data.WriteUInt64(GroupID);
data.WriteUInt8(Unknown_1100); data.WriteUInt8(OrderIndex);
data.WriteInt32(Flags); data.WriteUInt32(WarbandSceneID);
data.WriteUInt32(Flags);
data.WriteInt32(Members.Count); data.WriteInt32(Members.Count);
foreach (WarbandGroupMember member in Members) foreach (WarbandGroupMember member in Members)
member.Write(data); member.Write(data);
data.WriteBits(Name.GetByteCount(), 9);
data.FlushBits();
data.WriteString(Name);
} }
} }
@@ -11,7 +11,7 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
Type = (ItemCollectionType)_worldPacket.ReadUInt32(); Type = (ItemCollectionType)_worldPacket.ReadUInt8();
Id = _worldPacket.ReadUInt32(); Id = _worldPacket.ReadUInt32();
IsFavorite = _worldPacket.HasBit(); IsFavorite = _worldPacket.HasBit();
} }
@@ -254,13 +254,13 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(OriginalHonor); _worldPacket.WriteInt32(OriginalHonor);
_worldPacket.WriteInt32(Honor); _worldPacket.WriteInt32(Honor);
_worldPacket.WritePackedGuid(Target); _worldPacket.WritePackedGuid(Target);
_worldPacket.WriteUInt32(Rank); _worldPacket.WriteInt8(Rank);
} }
public int OriginalHonor; public int OriginalHonor;
public int Honor; public int Honor;
public ObjectGuid Target; public ObjectGuid Target;
public uint Rank; public sbyte Rank;
} }
class BreakTarget : ServerPacket class BreakTarget : ServerPacket
@@ -51,7 +51,7 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt32(FactionIndex); _worldPacket.WriteInt8(FactionIndex);
_worldPacket.WriteInt32(Garrisons.Count); _worldPacket.WriteInt32(Garrisons.Count);
_worldPacket.WriteInt32(FollowerSoftCaps.Count); _worldPacket.WriteInt32(FollowerSoftCaps.Count);
@@ -62,7 +62,7 @@ namespace Game.Networking.Packets
garrison.Write(_worldPacket); garrison.Write(_worldPacket);
} }
public uint FactionIndex; public sbyte FactionIndex;
public List<GarrisonInfo> Garrisons = new(); public List<GarrisonInfo> Garrisons = new();
public List<FollowerSoftCapInfo> FollowerSoftCaps = new(); public List<FollowerSoftCapInfo> FollowerSoftCaps = new();
} }
@@ -152,8 +152,8 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt8((byte)Result);
_worldPacket.WriteUInt32((uint)Command); _worldPacket.WriteUInt8((byte)Command);
_worldPacket.WriteBits(Name.GetByteCount(), 8); _worldPacket.WriteBits(Name.GetByteCount(), 8);
_worldPacket.WriteString(Name); _worldPacket.WriteString(Name);
@@ -793,13 +793,13 @@ namespace Game.Networking.Packets
public class EnableBarberShop : ServerPacket public class EnableBarberShop : ServerPacket
{ {
public byte CustomizationScope; public uint CustomizationFeatureMask;
public EnableBarberShop() : base(ServerOpcodes.EnableBarberShop) { } public EnableBarberShop() : base(ServerOpcodes.EnableBarberShop) { }
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt8(CustomizationScope); _worldPacket.WriteUInt32(CustomizationFeatureMask);
} }
} }
@@ -92,6 +92,7 @@ namespace Game.Networking.Packets
data.ReadBit(); // RemoteTimeValid data.ReadBit(); // RemoteTimeValid
bool hasInertia = data.HasBit(); bool hasInertia = data.HasBit();
bool hasAdvFlying = data.HasBit(); bool hasAdvFlying = data.HasBit();
bool hasDriveStatus = data.HasBit();
if (hasTransport) if (hasTransport)
ReadTransportInfo(data, ref movementInfo.transport); ReadTransportInfo(data, ref movementInfo.transport);
@@ -112,9 +113,9 @@ namespace Game.Networking.Packets
if (hasAdvFlying) if (hasAdvFlying)
{ {
MovementInfo.AdvFlying advFlying = new(); MovementInfo.AdvFlying advFlying = new();
advFlying.forwardVelocity = data.ReadFloat(); advFlying.forwardVelocity = data.ReadFloat();
advFlying.upVelocity = data.ReadFloat(); advFlying.upVelocity = data.ReadFloat();
movementInfo.advFlying = advFlying; movementInfo.advFlying = advFlying;
} }
@@ -134,6 +135,19 @@ namespace Game.Networking.Packets
} }
} }
if (hasDriveStatus)
{
data.ResetBitPos();
MovementInfo.Drive driveStatus = new();
driveStatus.accelerating = data.HasBit();
driveStatus.drifting = data.HasBit();
driveStatus.speed = data.ReadFloat();
driveStatus.movementAngle = data.ReadFloat();
movementInfo.driveStatus = driveStatus;
}
return movementInfo; return movementInfo;
} }
@@ -145,6 +159,7 @@ namespace Game.Networking.Packets
bool hasSpline = false; // todo 6.x send this infos bool hasSpline = false; // todo 6.x send this infos
bool hasInertia = movementInfo.inertia.HasValue; bool hasInertia = movementInfo.inertia.HasValue;
bool hasAdvFlying = movementInfo.advFlying.HasValue; bool hasAdvFlying = movementInfo.advFlying.HasValue;
bool hasDriveStatus = movementInfo.driveStatus.HasValue;
bool hasStandingOnGameObjectGUID = movementInfo.standingOnGameObjectGUID.HasValue; bool hasStandingOnGameObjectGUID = movementInfo.standingOnGameObjectGUID.HasValue;
data.WritePackedGuid(movementInfo.Guid); data.WritePackedGuid(movementInfo.Guid);
@@ -178,6 +193,7 @@ namespace Game.Networking.Packets
data.WriteBit(false); // RemoteTimeValid data.WriteBit(false); // RemoteTimeValid
data.WriteBit(hasInertia); data.WriteBit(hasInertia);
data.WriteBit(hasAdvFlying); data.WriteBit(hasAdvFlying);
data.WriteBit(hasDriveStatus);
data.FlushBits(); data.FlushBits();
if (hasTransportData) if (hasTransportData)
@@ -213,6 +229,14 @@ namespace Game.Networking.Packets
data.WriteFloat(movementInfo.jump.xyspeed); data.WriteFloat(movementInfo.jump.xyspeed);
} }
} }
if (hasDriveStatus)
{
data.WriteBit(movementInfo.driveStatus.Value.accelerating);
data.WriteBit(movementInfo.driveStatus.Value.drifting);
data.WriteFloat(movementInfo.driveStatus.Value.speed);
data.WriteFloat(movementInfo.driveStatus.Value.movementAngle);
}
} }
public static void WriteCreateObjectSplineDataBlock(MoveSpline moveSpline, WorldPacket data) public static void WriteCreateObjectSplineDataBlock(MoveSpline moveSpline, WorldPacket data)
@@ -360,6 +384,9 @@ namespace Game.Networking.Packets
data.WriteUInt32(movementForce.TransportID); data.WriteUInt32(movementForce.TransportID);
data.WriteFloat(movementForce.Magnitude); data.WriteFloat(movementForce.Magnitude);
data.WriteInt32(movementForce.MovementForceID); data.WriteInt32(movementForce.MovementForceID);
data.WriteInt32(movementForce.Unknown1110_1);
data.WriteInt32(movementForce.Unused1110);
data.WriteUInt32(movementForce.Flags);
data.WriteBits((byte)movementForce.Type, 2); data.WriteBits((byte)movementForce.Type, 2);
data.FlushBits(); data.FlushBits();
} }
@@ -608,6 +635,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteXYZ(OldMapPosition); _worldPacket.WriteXYZ(OldMapPosition);
_worldPacket.WriteBit(Ship.HasValue); _worldPacket.WriteBit(Ship.HasValue);
_worldPacket.WriteBit(TransferSpellID.HasValue); _worldPacket.WriteBit(TransferSpellID.HasValue);
_worldPacket.WriteBit(TaxiPathID.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
if (Ship.HasValue) if (Ship.HasValue)
@@ -618,12 +646,16 @@ namespace Game.Networking.Packets
if (TransferSpellID.HasValue) if (TransferSpellID.HasValue)
_worldPacket.WriteInt32(TransferSpellID.Value); _worldPacket.WriteInt32(TransferSpellID.Value);
if (TaxiPathID.HasValue)
_worldPacket.WriteInt32(TaxiPathID.Value);
} }
public int MapID = -1; public int MapID = -1;
public Position OldMapPosition; public Position OldMapPosition;
public ShipTransferPending? Ship; public ShipTransferPending? Ship;
public int? TransferSpellID; public int? TransferSpellID;
public int? TaxiPathID;
public struct ShipTransferPending public struct ShipTransferPending
{ {
@@ -1252,6 +1284,7 @@ namespace Game.Networking.Packets
data.WriteBit(MovementForceGUID.HasValue); data.WriteBit(MovementForceGUID.HasValue);
data.WriteBit(MovementInertiaID.HasValue); data.WriteBit(MovementInertiaID.HasValue);
data.WriteBit(MovementInertiaLifetimeMs.HasValue); data.WriteBit(MovementInertiaLifetimeMs.HasValue);
data.WriteBit(DriveCapabilityRecID.HasValue);
data.FlushBits(); data.FlushBits();
if (@MovementForce != null) if (@MovementForce != null)
@@ -1292,6 +1325,9 @@ namespace Game.Networking.Packets
if (MovementInertiaLifetimeMs.HasValue) if (MovementInertiaLifetimeMs.HasValue)
data.WriteUInt32(MovementInertiaLifetimeMs.Value); data.WriteUInt32(MovementInertiaLifetimeMs.Value);
if (DriveCapabilityRecID.HasValue)
data.WriteInt32(DriveCapabilityRecID.Value);
} }
public ServerOpcodes MessageID; public ServerOpcodes MessageID;
@@ -1305,6 +1341,7 @@ namespace Game.Networking.Packets
public ObjectGuid? MovementForceGUID; public ObjectGuid? MovementForceGUID;
public int? MovementInertiaID; public int? MovementInertiaID;
public uint? MovementInertiaLifetimeMs; public uint? MovementInertiaLifetimeMs;
public int? DriveCapabilityRecID;
} }
} }
@@ -13,6 +13,7 @@ namespace Game.Networking.Packets
public int BestRunLevel; public int BestRunLevel;
public int BestRunDurationMS; public int BestRunDurationMS;
public bool FinishedSuccess; public bool FinishedSuccess;
public byte Unknown1110;
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
@@ -20,6 +21,7 @@ namespace Game.Networking.Packets
data.WriteFloat(MapScore); data.WriteFloat(MapScore);
data.WriteInt32(BestRunLevel); data.WriteInt32(BestRunLevel);
data.WriteInt32(BestRunDurationMS); data.WriteInt32(BestRunDurationMS);
data.WriteUInt8(Unknown1110);
data.WriteBit(FinishedSuccess); data.WriteBit(FinishedSuccess);
data.FlushBits(); data.FlushBits();
} }
@@ -50,7 +52,7 @@ namespace Game.Networking.Packets
public uint NativeRealmAddress; public uint NativeRealmAddress;
public uint VirtualRealmAddress; public uint VirtualRealmAddress;
public int ChrSpecializationID; public int ChrSpecializationID;
public short RaceID; public sbyte RaceID;
public int ItemLevel; public int ItemLevel;
public int CovenantID; public int CovenantID;
public int SoulbindID; public int SoulbindID;
@@ -64,7 +66,7 @@ namespace Game.Networking.Packets
data.WriteUInt32(NativeRealmAddress); data.WriteUInt32(NativeRealmAddress);
data.WriteUInt32(VirtualRealmAddress); data.WriteUInt32(VirtualRealmAddress);
data.WriteInt32(ChrSpecializationID); data.WriteInt32(ChrSpecializationID);
data.WriteInt16(RaceID); data.WriteInt8(RaceID);
data.WriteInt32(ItemLevel); data.WriteInt32(ItemLevel);
data.WriteInt32(CovenantID); data.WriteInt32(CovenantID);
data.WriteInt32(SoulbindID); data.WriteInt32(SoulbindID);
+2 -2
View File
@@ -340,7 +340,7 @@ namespace Game.Networking.Packets
public int GossipOptionID; public int GossipOptionID;
public GossipOptionNpc OptionNPC; public GossipOptionNpc OptionNPC;
public byte OptionFlags; public byte OptionFlags;
public int OptionCost; public ulong OptionCost;
public uint OptionLanguage; public uint OptionLanguage;
public GossipOptionFlags Flags; public GossipOptionFlags Flags;
public int OrderIndex; public int OrderIndex;
@@ -357,7 +357,7 @@ namespace Game.Networking.Packets
data.WriteInt32(GossipOptionID); data.WriteInt32(GossipOptionID);
data.WriteUInt8((byte)OptionNPC); data.WriteUInt8((byte)OptionNPC);
data.WriteInt8((sbyte)OptionFlags); data.WriteInt8((sbyte)OptionFlags);
data.WriteInt32(OptionCost); data.WriteUInt64(OptionCost);
data.WriteUInt32(OptionLanguage); data.WriteUInt32(OptionLanguage);
data.WriteInt32((int)Flags); data.WriteInt32((int)Flags);
data.WriteInt32(OrderIndex); data.WriteInt32(OrderIndex);
@@ -195,9 +195,14 @@ namespace Game.Networking.Packets
class GroupUninvite : ServerPacket class GroupUninvite : ServerPacket
{ {
public byte Reason;
public GroupUninvite() : base(ServerOpcodes.GroupUninvite) { } public GroupUninvite() : base(ServerOpcodes.GroupUninvite) { }
public override void Write() { } public override void Write()
{
_worldPacket.WriteUInt8(Reason);
}
} }
class RequestPartyMemberStats : ClientPacket class RequestPartyMemberStats : ClientPacket
@@ -365,7 +370,7 @@ namespace Game.Networking.Packets
} }
MemberStats.ChromieTime.ConditionalFlags = player.m_playerData.CtrOptions.GetValue().ConditionalFlags; MemberStats.ChromieTime.ConditionalFlags = player.m_playerData.CtrOptions.GetValue().ConditionalFlags;
MemberStats.ChromieTime.FactionGroup = (int)player.m_playerData.CtrOptions.GetValue().FactionGroup; MemberStats.ChromieTime.FactionGroup = (sbyte)player.m_playerData.CtrOptions.GetValue().FactionGroup;
MemberStats.ChromieTime.ChromieTimeExpansionMask = player.m_playerData.CtrOptions.GetValue().ChromieTimeExpansionMask; MemberStats.ChromieTime.ChromieTimeExpansionMask = player.m_playerData.CtrOptions.GetValue().ChromieTimeExpansionMask;
} }
@@ -1167,13 +1172,13 @@ namespace Game.Networking.Packets
public struct CTROptions public struct CTROptions
{ {
public uint ConditionalFlags; public uint ConditionalFlags;
public int FactionGroup; public sbyte FactionGroup;
public uint ChromieTimeExpansionMask; public uint ChromieTimeExpansionMask;
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt32(ConditionalFlags); data.WriteUInt32(ConditionalFlags);
data.WriteInt32(FactionGroup); data.WriteInt8(FactionGroup);
data.WriteUInt32(ChromieTimeExpansionMask); data.WriteUInt32(ChromieTimeExpansionMask);
} }
} }
@@ -12,6 +12,7 @@ namespace Game.Networking.Packets
public int ItemModifiedAppearanceID; public int ItemModifiedAppearanceID;
public int TransmogIllusionID; public int TransmogIllusionID;
public int ToyID; public int ToyID;
public int WarbandSceneID;
public int Price; public int Price;
public int OriginalPrice; public int OriginalPrice;
public long AvailableUntil; public long AvailableUntil;
@@ -30,6 +31,7 @@ namespace Game.Networking.Packets
data.WriteInt32(Price); data.WriteInt32(Price);
data.WriteInt32(OriginalPrice); data.WriteInt32(OriginalPrice);
data.WriteInt64(AvailableUntil); data.WriteInt64(AvailableUntil);
data.WriteInt32(WarbandSceneID);
data.WriteBit(Disabled); data.WriteBit(Disabled);
data.WriteBit(DoesNotExpire); data.WriteBit(DoesNotExpire);
data.FlushBits(); data.FlushBits();
+1 -1
View File
@@ -143,7 +143,7 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt8((byte)Result); _worldPacket.WriteInt32((int)Result);
} }
public StableResult Result; public StableResult Result;
@@ -87,9 +87,9 @@ namespace Game.Networking.Packets
for (var i = 0; i < 2; ++i) for (var i = 0; i < 2; ++i)
_worldPacket.WriteUInt32(Stats.Flags[i]); _worldPacket.WriteUInt32(Stats.Flags[i]);
_worldPacket.WriteInt32(Stats.CreatureType); _worldPacket.WriteInt8(Stats.CreatureType);
_worldPacket.WriteInt32(Stats.CreatureFamily); _worldPacket.WriteInt32(Stats.CreatureFamily);
_worldPacket.WriteInt32(Stats.Classification); _worldPacket.WriteInt8(Stats.Classification);
for (var i = 0; i < SharedConst.MaxCreatureKillCredit; ++i) for (var i = 0; i < SharedConst.MaxCreatureKillCredit; ++i)
_worldPacket.WriteUInt32(Stats.ProxyCreatureID[i]); _worldPacket.WriteUInt32(Stats.ProxyCreatureID[i]);
@@ -750,9 +750,9 @@ namespace Game.Networking.Packets
public string Title; public string Title;
public string TitleAlt; public string TitleAlt;
public string CursorName; public string CursorName;
public int CreatureType; public sbyte CreatureType;
public int CreatureFamily; public int CreatureFamily;
public int Classification; public sbyte Classification;
public CreatureDisplayStats Display = new(); public CreatureDisplayStats Display = new();
public float HpMulti; public float HpMulti;
public float EnergyMulti; public float EnergyMulti;
@@ -67,7 +67,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt8((byte)Status); _worldPacket.WriteUInt8((byte)Status);
_worldPacket.WriteUInt32(AreaID); _worldPacket.WriteUInt32(AreaID);
_worldPacket.WriteUInt32(Level); _worldPacket.WriteUInt32(Level);
_worldPacket.WriteUInt32((uint)ClassID); _worldPacket.WriteInt8((sbyte)ClassID);
_worldPacket.WriteBits(Notes.GetByteCount(), 10); _worldPacket.WriteBits(Notes.GetByteCount(), 10);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
_worldPacket.WriteString(Notes); _worldPacket.WriteString(Notes);
@@ -200,7 +200,7 @@ namespace Game.Networking.Packets
data.WriteUInt8((byte)Status); data.WriteUInt8((byte)Status);
data.WriteUInt32(AreaID); data.WriteUInt32(AreaID);
data.WriteUInt32(Level); data.WriteUInt32(Level);
data.WriteUInt32((uint)ClassID); data.WriteInt8((sbyte)ClassID);
data.WriteBits(Notes.GetByteCount(), 10); data.WriteBits(Notes.GetByteCount(), 10);
data.FlushBits(); data.FlushBits();
data.WriteString(Notes); data.WriteString(Notes);
@@ -1620,6 +1620,7 @@ namespace Game.Networking.Packets
data.WriteUInt16(CastLevel); data.WriteUInt16(CastLevel);
data.WriteUInt8(Applications); data.WriteUInt8(Applications);
data.WriteInt32(ContentTuningID); data.WriteInt32(ContentTuningID);
data.WriteVector3(DstLocation);
data.WriteBit(CastUnit.HasValue); data.WriteBit(CastUnit.HasValue);
data.WriteBit(Duration.HasValue); data.WriteBit(Duration.HasValue);
data.WriteBit(Remaining.HasValue); data.WriteBit(Remaining.HasValue);
@@ -1665,13 +1666,14 @@ namespace Game.Networking.Packets
float? TimeMod; float? TimeMod;
public List<float> Points = new(); public List<float> Points = new();
public List<float> EstimatedPoints = new(); public List<float> EstimatedPoints = new();
public Vector3 DstLocation;
} }
public struct AuraInfo public struct AuraInfo
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt8(Slot); data.WriteUInt16(Slot);
data.WriteBit(AuraData != null); data.WriteBit(AuraData != null);
data.FlushBits(); data.FlushBits();
@@ -1679,7 +1681,7 @@ namespace Game.Networking.Packets
AuraData.Write(data); AuraData.Write(data);
} }
public byte Slot; public ushort Slot;
public AuraDataInfo AuraData; public AuraDataInfo AuraData;
} }
@@ -42,10 +42,16 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt16(NameLookupTelemetryInterval); _worldPacket.WriteInt16(NameLookupTelemetryInterval);
_worldPacket.WriteUInt32((uint)NotFoundCacheTimeSeconds.TotalSeconds); _worldPacket.WriteUInt32((uint)NotFoundCacheTimeSeconds.TotalSeconds);
_worldPacket.WriteUInt32(RealmPvpTypeOverride);
_worldPacket.WriteInt32(AddonChatThrottle.MaxTries); _worldPacket.WriteInt32(AddonChatThrottle.MaxTries);
_worldPacket.WriteInt32(AddonChatThrottle.TriesRestoredPerSecond); _worldPacket.WriteInt32(AddonChatThrottle.TriesRestoredPerSecond);
_worldPacket.WriteInt32(AddonChatThrottle.UsedTriesPerMessage); _worldPacket.WriteInt32(AddonChatThrottle.UsedTriesPerMessage);
_worldPacket.WriteFloat(AddonPerformanceMsgWarning);
_worldPacket.WriteFloat(AddonPerformanceMsgError);
_worldPacket.WriteFloat(AddonPerformanceMsgOverall);
foreach (GameRuleValuePair gameRuleValue in GameRules) foreach (GameRuleValuePair gameRuleValue in GameRules)
gameRuleValue.Write(_worldPacket); gameRuleValue.Write(_worldPacket);
@@ -108,6 +114,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(false); // unused 11.0.7 _worldPacket.WriteBit(false); // unused 11.0.7
_worldPacket.WriteBit(LobbyMatchmakerQueueFromMainlineEnabled); _worldPacket.WriteBit(LobbyMatchmakerQueueFromMainlineEnabled);
_worldPacket.WriteBit(CanSendLobbyMatchmakerPartyCustomizations); _worldPacket.WriteBit(CanSendLobbyMatchmakerPartyCustomizations);
_worldPacket.WriteBit(AddonProfilerEnabled);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -216,6 +223,7 @@ namespace Game.Networking.Packets
public bool IsAccountCurrencyTransferEnabled; public bool IsAccountCurrencyTransferEnabled;
public bool LobbyMatchmakerQueueFromMainlineEnabled; public bool LobbyMatchmakerQueueFromMainlineEnabled;
public bool CanSendLobbyMatchmakerPartyCustomizations; public bool CanSendLobbyMatchmakerPartyCustomizations;
public bool AddonProfilerEnabled;
public SocialQueueConfig QuickJoinConfig; public SocialQueueConfig QuickJoinConfig;
public SquelchInfo Squelch; public SquelchInfo Squelch;
@@ -225,6 +233,10 @@ namespace Game.Networking.Packets
public int RemainingTimerunningSeasonSeconds; public int RemainingTimerunningSeasonSeconds;
public string Unknown1027; // related to movement lua functions used by keybinds public string Unknown1027; // related to movement lua functions used by keybinds
public AddonChatThrottleParams AddonChatThrottle; public AddonChatThrottleParams AddonChatThrottle;
public uint RealmPvpTypeOverride; ///< Use Cfg_Configs value = 0, ForceEnabled = 1, ForceDisabled = 2
public float AddonPerformanceMsgWarning;
public float AddonPerformanceMsgError;
public float AddonPerformanceMsgOverall;
public struct SessionAlertConfig public struct SessionAlertConfig
{ {
+2 -2
View File
@@ -80,12 +80,12 @@ namespace Game.Networking.Packets
{ {
public void Read(WorldPacket data) public void Read(WorldPacket data)
{ {
FactionGroup = data.ReadInt32(); FactionGroup = data.ReadUInt8();
Locale = data.ReadInt32(); Locale = data.ReadInt32();
RequesterVirtualRealmAddress = data.ReadUInt32(); RequesterVirtualRealmAddress = data.ReadUInt32();
} }
public int FactionGroup; public byte FactionGroup;
public int Locale; public int Locale;
public uint RequesterVirtualRealmAddress; public uint RequesterVirtualRealmAddress;
} }
+1 -1
View File
@@ -48,7 +48,7 @@ namespace Game.Scripting
player.PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, false, 0, "", null, null, sender, action); player.PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, false, 0, "", null, null, sender, action);
} }
// Using provided texts, not from DB // Using provided texts, not from DB
public static void AddGossipItemFor(Player player, GossipOptionNpc optionNpc, string text, uint sender, uint action, string popupText, uint popupMoney, bool coded) public static void AddGossipItemFor(Player player, GossipOptionNpc optionNpc, string text, uint sender, uint action, string popupText, ulong popupMoney, bool coded)
{ {
player.PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, coded, popupMoney, popupText, null, null, sender, action); player.PlayerTalkClass.GetGossipMenu().AddMenuItem(0, -1, optionNpc, text, 0, GossipOptionFlags.None, null, 0, 0, coded, popupMoney, popupText, null, null, sender, action);
} }
+3 -3
View File
@@ -51,7 +51,7 @@ namespace Game.Spells
Unit _target; Unit _target;
Aura _base; Aura _base;
AuraRemoveMode _removeMode; // Store info for know remove aura reason AuraRemoveMode _removeMode; // Store info for know remove aura reason
byte _slot; // Aura slot on unit ushort _slot; // Aura slot on unit
AuraFlags _flags; // Aura info flag AuraFlags _flags; // Aura info flag
uint _effectsToApply; // Used only at spell hit to determine which effect should be applied uint _effectsToApply; // Used only at spell hit to determine which effect should be applied
bool _needClientUpdate; bool _needClientUpdate;
@@ -70,7 +70,7 @@ namespace Game.Spells
Cypher.Assert(GetTarget() != null && GetBase() != null); Cypher.Assert(GetTarget() != null && GetBase() != null);
// Try find slot for aura // Try find slot for aura
byte slot = 0; ushort slot = 0;
// Lookup for auras already applied from spell // Lookup for auras already applied from spell
foreach (AuraApplication visibleAura in GetTarget().GetVisibleAuras()) foreach (AuraApplication visibleAura in GetTarget().GetVisibleAuras())
{ {
@@ -314,7 +314,7 @@ namespace Game.Spells
public Unit GetTarget() { return _target; } public Unit GetTarget() { return _target; }
public Aura GetBase() { return _base; } public Aura GetBase() { return _base; }
public byte GetSlot() { return _slot; } public ushort GetSlot() { return _slot; }
public AuraFlags GetFlags() { return _flags; } public AuraFlags GetFlags() { return _flags; }
public uint GetEffectMask() { return _effectMask; } public uint GetEffectMask() { return _effectMask; }
public bool HasEffect(uint effect) public bool HasEffect(uint effect)