hondacrx
2024-02-02 21:49:02 -05:00
parent 75201f56ce
commit 4b669cfb5d
45 changed files with 1742 additions and 1273 deletions
@@ -447,6 +447,11 @@ namespace Framework.Constants
PlayerHasCompletedQuestWithLabel = 372, /*NYI*/ // Player has previously completed quest with {QuestLabel} PlayerHasCompletedQuestWithLabel = 372, /*NYI*/ // Player has previously completed quest with {QuestLabel}
LegacyLootIsEnabled = 373, /*NYI*/ LegacyLootIsEnabled = 373, /*NYI*/
PlayerZPositionBelow = 374, PlayerZPositionBelow = 374,
PlayerWeaponHighWatermarkAboveOrEqual = 375, /*NYI*/
PlayerHeadHighWatermarkAboveOrEqual = 376, /*NYI*/
PlayerHasDisplayedCurrencyLessThan = 377, /*NYI*/ // Player has {CurrencyTypes} less than {#Amount} (value visible in ui is taken into account, not raw value)
PlayerIsOnMapWithExpansion = 380, // Player is on map that has {ExpansionID}
} }
public enum CriteriaFailEvent : byte public enum CriteriaFailEvent : byte
@@ -467,7 +472,7 @@ namespace Framework.Constants
DailyQuestsCleared = 13, // Daily quests cleared DailyQuestsCleared = 13, // Daily quests cleared
SendEvent = 14, // Send event "{GameEvents}" (player-sent/instance only) SendEvent = 14, // Send event "{GameEvents}" (player-sent/instance only)
Max Count
} }
public enum CriteriaStartEvent : byte public enum CriteriaStartEvent : byte
@@ -488,7 +493,7 @@ namespace Framework.Constants
SendEvent = 13, // Send event "{GameEvents}" (player-sent/instance only) SendEvent = 13, // Send event "{GameEvents}" (player-sent/instance only)
BeginScenarioStep = 14, // Begin scenario step "{#Step}" (for use with "Player on Scenario" modifier only) BeginScenarioStep = 14, // Begin scenario step "{#Step}" (for use with "Player on Scenario" modifier only)
Max Count
} }
public enum CriteriaFlags public enum CriteriaFlags
@@ -501,7 +506,7 @@ namespace Framework.Constants
IsForQuest = 0x20 // Is For Quest IsForQuest = 0x20 // Is For Quest
} }
public enum CriteriaType : byte public enum CriteriaType : short
{ {
KillCreature = 0, // Kill NPC "{Creature}" KillCreature = 0, // Kill NPC "{Creature}"
WinBattleground = 1, // Win battleground "{Map}" WinBattleground = 1, // Win battleground "{Map}"
@@ -745,6 +750,7 @@ namespace Framework.Constants
PerksProgramMonthComplete = 249, /*NYI*/ PerksProgramMonthComplete = 249, /*NYI*/
CompleteTrackingQuest = 250, /*NYI*/ CompleteTrackingQuest = 250, /*NYI*/
GainLevels = 253, // Gain levels
Count Count
} }
+6 -5
View File
@@ -1841,7 +1841,7 @@ namespace Framework.Constants
Some = 8 Some = 8
} }
public enum MountCapabilityFlags : byte public enum MountCapabilityFlags : int
{ {
Ground = 0x1, Ground = 0x1,
Flying = 0x2, Flying = 0x2,
@@ -1850,7 +1850,7 @@ namespace Framework.Constants
IgnoreRestrictions = 0x20 IgnoreRestrictions = 0x20
} }
public enum MountFlags : ushort public enum MountFlags : int
{ {
SelfMount = 0x02, // Player becomes the mount himself SelfMount = 0x02, // Player becomes the mount himself
FactionSpecific = 0x04, FactionSpecific = 0x04,
@@ -1859,7 +1859,7 @@ namespace Framework.Constants
HideIfUnknown = 0x40 HideIfUnknown = 0x40
} }
public enum PhaseEntryFlags : ushort public enum PhaseEntryFlags : int
{ {
ReadOnly = 0x1, ReadOnly = 0x1,
InternalPhase = 0x2, InternalPhase = 0x2,
@@ -1912,7 +1912,7 @@ namespace Framework.Constants
Registrar = 11, Registrar = 11,
Vendor = 12, Vendor = 12,
PetitionVendor = 13, PetitionVendor = 13,
TabardVendor = 14, GuildTabardVendor = 14,
TalentMaster = 15, TalentMaster = 15,
SpecializationMaster = 16, SpecializationMaster = 16,
MailInfo = 17, MailInfo = 17,
@@ -1962,7 +1962,8 @@ namespace Framework.Constants
TraitSystem = 61, TraitSystem = 61,
BarbersChoice = 62, BarbersChoice = 62,
JailersTowerBuffs = 63, JailersTowerBuffs = 63,
MajorFactionRenown = 64 MajorFactionRenown = 64,
PersonalTabardVendor = 65
} }
[Flags] [Flags]
+2 -1
View File
@@ -225,7 +225,8 @@ namespace Framework.Constants
ContributionCollector = 0x400, ContributionCollector = 0x400,
AzeriteRespec = 0x4000, AzeriteRespec = 0x4000,
IslandsQueue = 0x8000, IslandsQueue = 0x8000,
SuppressNpcSoundsExceptEndOfInteraction = 0x00010000, SuppressNpcSoundsExceptEndOfInteraction = 0x10000,
PersonalTabardDesigner = 0x200000
} }
[Flags] [Flags]
+3 -1
View File
@@ -40,7 +40,7 @@ namespace Framework.Constants
Binder = 5, // Golden interaction wheel Binder = 5, // Golden interaction wheel
Banker = 6, // Brown bag (with gold coin in lower corner) Banker = 6, // Brown bag (with gold coin in lower corner)
PetitionVendor = 7, // White chat bubble (with "..." inside) PetitionVendor = 7, // White chat bubble (with "..." inside)
TabardVendor = 8, // White tabard GuildTabardVendor = 8, // White tabard
Battlemaster = 9, // Two crossed swords Battlemaster = 9, // Two crossed swords
Auctioneer = 10, // Stack of gold coins Auctioneer = 10, // Stack of gold coins
TalentMaster = 11, // White chat bubble TalentMaster = 11, // White chat bubble
@@ -86,6 +86,8 @@ namespace Framework.Constants
TraitSystem = 51, TraitSystem = 51,
BarbersChoice = 52, BarbersChoice = 52,
MajorFactionRenown = 53, MajorFactionRenown = 53,
PersonalTabardVendor = 54,
Max Max
} }
File diff suppressed because it is too large Load Diff
@@ -894,4 +894,10 @@ namespace Framework.Constants
DroppedFromDeath = 0x02, DroppedFromDeath = 0x02,
FromAccountServer = 0x04 FromAccountServer = 0x04
} }
public enum TabardVendorType
{
Guild = 0,
Personal = 1,
}
} }
+288 -286
View File
@@ -2726,293 +2726,295 @@ namespace Framework.Constants
ArenaTeamPartySize = 836, ArenaTeamPartySize = 836,
SoloShuffleWargameGroupSize = 837, SoloShuffleWargameGroupSize = 837,
SoloShuffleWargameGroupComp = 838, SoloShuffleWargameGroupComp = 838,
SoloShuffleMinItemLevel = 839, SoloMinItemLevel = 839,
PvpPlayerAbandoned = 840, PvpPlayerAbandoned = 840,
QuestForceRemovedS = 841, BattlegroundJoinGroupQueueWithoutHealer = 841,
AttackNoActions = 842, QuestForceRemovedS = 842,
InRandomBg = 843, AttackNoActions = 843,
InNonRandomBg = 844, InRandomBg = 844,
BnFriendSelf = 845, InNonRandomBg = 845,
BnFriendAlready = 846, BnFriendSelf = 846,
BnFriendBlocked = 847, BnFriendAlready = 847,
BnFriendListFull = 848, BnFriendBlocked = 848,
BnFriendRequestSent = 849, BnFriendListFull = 849,
BnBroadcastThrottle = 850, BnFriendRequestSent = 850,
BgDeveloperOnly = 851, BnBroadcastThrottle = 851,
CurrencySpellSlotMismatch = 852, BgDeveloperOnly = 852,
CurrencyNotTradable = 853, CurrencySpellSlotMismatch = 853,
RequiresExpansionS = 854, CurrencyNotTradable = 854,
QuestFailedSpell = 855, RequiresExpansionS = 855,
TalentFailedUnspentTalentPoints = 856, QuestFailedSpell = 856,
TalentFailedNotEnoughTalentsInPrimaryTree = 857, TalentFailedUnspentTalentPoints = 857,
TalentFailedNoPrimaryTreeSelected = 858, TalentFailedNotEnoughTalentsInPrimaryTree = 858,
TalentFailedCantRemoveTalent = 859, TalentFailedNoPrimaryTreeSelected = 859,
TalentFailedUnknown = 860, TalentFailedCantRemoveTalent = 860,
TalentFailedInCombat = 861, TalentFailedUnknown = 861,
TalentFailedInPvpMatch = 862, TalentFailedInCombat = 862,
TalentFailedInMythicPlus = 863, TalentFailedInPvpMatch = 863,
WargameRequestFailure = 864, TalentFailedInMythicPlus = 864,
RankRequiresAuthenticator = 865, WargameRequestFailure = 865,
GuildBankVoucherFailed = 866, RankRequiresAuthenticator = 866,
WargameRequestSent = 867, GuildBankVoucherFailed = 867,
RequiresAchievementI = 868, WargameRequestSent = 868,
RefundResultExceedMaxCurrency = 869, RequiresAchievementI = 869,
CantBuyQuantity = 870, RefundResultExceedMaxCurrency = 870,
ItemIsBattlePayLocked = 871, CantBuyQuantity = 871,
PartyAlreadyInBattlegroundQueue = 872, ItemIsBattlePayLocked = 872,
PartyConfirmingBattlegroundQueue = 873, PartyAlreadyInBattlegroundQueue = 873,
BattlefieldTeamPartySize = 874, PartyConfirmingBattlegroundQueue = 874,
InsuffTrackedCurrencyIs = 875, BattlefieldTeamPartySize = 875,
NotOnTournamentRealm = 876, InsuffTrackedCurrencyIs = 876,
GuildTrialAccountTrial = 877, NotOnTournamentRealm = 877,
GuildTrialAccountVeteran = 878, GuildTrialAccountTrial = 878,
GuildUndeletableDueToLevel = 879, GuildTrialAccountVeteran = 879,
CantDoThatInAGroup = 880, GuildUndeletableDueToLevel = 880,
GuildLeaderReplaced = 881, CantDoThatInAGroup = 881,
TransmogrifyCantEquip = 882, GuildLeaderReplaced = 882,
TransmogrifyInvalidItemType = 883, TransmogrifyCantEquip = 883,
TransmogrifyNotSoulbound = 884, TransmogrifyInvalidItemType = 884,
TransmogrifyInvalidSource = 885, TransmogrifyNotSoulbound = 885,
TransmogrifyInvalidDestination = 886, TransmogrifyInvalidSource = 886,
TransmogrifyMismatch = 887, TransmogrifyInvalidDestination = 887,
TransmogrifyLegendary = 888, TransmogrifyMismatch = 888,
TransmogrifySameItem = 889, TransmogrifyLegendary = 889,
TransmogrifySameAppearance = 890, TransmogrifySameItem = 890,
TransmogrifyNotEquipped = 891, TransmogrifySameAppearance = 891,
VoidDepositFull = 892, TransmogrifyNotEquipped = 892,
VoidWithdrawFull = 893, VoidDepositFull = 893,
VoidStorageWrapped = 894, VoidWithdrawFull = 894,
VoidStorageStackable = 895, VoidStorageWrapped = 895,
VoidStorageUnbound = 896, VoidStorageStackable = 896,
VoidStorageRepair = 897, VoidStorageUnbound = 897,
VoidStorageCharges = 898, VoidStorageRepair = 898,
VoidStorageQuest = 899, VoidStorageCharges = 899,
VoidStorageConjured = 900, VoidStorageQuest = 900,
VoidStorageMail = 901, VoidStorageConjured = 901,
VoidStorageBag = 902, VoidStorageMail = 902,
VoidTransferStorageFull = 903, VoidStorageBag = 903,
VoidTransferInvFull = 904, VoidTransferStorageFull = 904,
VoidTransferInternalError = 905, VoidTransferInvFull = 905,
VoidTransferItemInvalid = 906, VoidTransferInternalError = 906,
DifficultyDisabledInLfg = 907, VoidTransferItemInvalid = 907,
VoidStorageUnique = 908, DifficultyDisabledInLfg = 908,
VoidStorageLoot = 909, VoidStorageUnique = 909,
VoidStorageHoliday = 910, VoidStorageLoot = 910,
VoidStorageDuration = 911, VoidStorageHoliday = 911,
VoidStorageLoadFailed = 912, VoidStorageDuration = 912,
VoidStorageInvalidItem = 913, VoidStorageLoadFailed = 913,
ParentalControlsChatMuted = 914, VoidStorageInvalidItem = 914,
SorStartExperienceIncomplete = 915, ParentalControlsChatMuted = 915,
SorInvalidEmail = 916, SorStartExperienceIncomplete = 916,
SorInvalidComment = 917, SorInvalidEmail = 917,
ChallengeModeResetCooldownS = 918, SorInvalidComment = 918,
ChallengeModeResetKeystone = 919, ChallengeModeResetCooldownS = 919,
PetJournalAlreadyInLoadout = 920, ChallengeModeResetKeystone = 920,
ReportSubmittedSuccessfully = 921, PetJournalAlreadyInLoadout = 921,
ReportSubmissionFailed = 922, ReportSubmittedSuccessfully = 922,
SuggestionSubmittedSuccessfully = 923, ReportSubmissionFailed = 923,
BugSubmittedSuccessfully = 924, SuggestionSubmittedSuccessfully = 924,
ChallengeModeEnabled = 925, BugSubmittedSuccessfully = 925,
ChallengeModeDisabled = 926, ChallengeModeEnabled = 926,
PetbattleCreateFailed = 927, ChallengeModeDisabled = 927,
PetbattleNotHere = 928, PetbattleCreateFailed = 928,
PetbattleNotHereOnTransport = 929, PetbattleNotHere = 929,
PetbattleNotHereUnevenGround = 930, PetbattleNotHereOnTransport = 930,
PetbattleNotHereObstructed = 931, PetbattleNotHereUnevenGround = 931,
PetbattleNotWhileInCombat = 932, PetbattleNotHereObstructed = 932,
PetbattleNotWhileDead = 933, PetbattleNotWhileInCombat = 933,
PetbattleNotWhileFlying = 934, PetbattleNotWhileDead = 934,
PetbattleTargetInvalid = 935, PetbattleNotWhileFlying = 935,
PetbattleTargetOutOfRange = 936, PetbattleTargetInvalid = 936,
PetbattleTargetNotCapturable = 937, PetbattleTargetOutOfRange = 937,
PetbattleNotATrainer = 938, PetbattleTargetNotCapturable = 938,
PetbattleDeclined = 939, PetbattleNotATrainer = 939,
PetbattleInBattle = 940, PetbattleDeclined = 940,
PetbattleInvalidLoadout = 941, PetbattleInBattle = 941,
PetbattleAllPetsDead = 942, PetbattleInvalidLoadout = 942,
PetbattleNoPetsInSlots = 943, PetbattleAllPetsDead = 943,
PetbattleNoAccountLock = 944, PetbattleNoPetsInSlots = 944,
PetbattleWildPetTapped = 945, PetbattleNoAccountLock = 945,
PetbattleRestrictedAccount = 946, PetbattleWildPetTapped = 946,
PetbattleOpponentNotAvailable = 947, PetbattleRestrictedAccount = 947,
PetbattleNotWhileInMatchedBattle = 948, PetbattleOpponentNotAvailable = 948,
CantHaveMorePetsOfThatType = 949, PetbattleNotWhileInMatchedBattle = 949,
CantHaveMorePets = 950, CantHaveMorePetsOfThatType = 950,
PvpMapNotFound = 951, CantHaveMorePets = 951,
PvpMapNotSet = 952, PvpMapNotFound = 952,
PetbattleQueueQueued = 953, PvpMapNotSet = 953,
PetbattleQueueAlreadyQueued = 954, PetbattleQueueQueued = 954,
PetbattleQueueJoinFailed = 955, PetbattleQueueAlreadyQueued = 955,
PetbattleQueueJournalLock = 956, PetbattleQueueJoinFailed = 956,
PetbattleQueueRemoved = 957, PetbattleQueueJournalLock = 957,
PetbattleQueueProposalDeclined = 958, PetbattleQueueRemoved = 958,
PetbattleQueueProposalTimeout = 959, PetbattleQueueProposalDeclined = 959,
PetbattleQueueOpponentDeclined = 960, PetbattleQueueProposalTimeout = 960,
PetbattleQueueRequeuedInternal = 961, PetbattleQueueOpponentDeclined = 961,
PetbattleQueueRequeuedRemoved = 962, PetbattleQueueRequeuedInternal = 962,
PetbattleQueueSlotLocked = 963, PetbattleQueueRequeuedRemoved = 963,
PetbattleQueueSlotEmpty = 964, PetbattleQueueSlotLocked = 964,
PetbattleQueueSlotNoTracker = 965, PetbattleQueueSlotEmpty = 965,
PetbattleQueueSlotNoSpecies = 966, PetbattleQueueSlotNoTracker = 966,
PetbattleQueueSlotCantBattle = 967, PetbattleQueueSlotNoSpecies = 967,
PetbattleQueueSlotRevoked = 968, PetbattleQueueSlotCantBattle = 968,
PetbattleQueueSlotDead = 969, PetbattleQueueSlotRevoked = 969,
PetbattleQueueSlotNoPet = 970, PetbattleQueueSlotDead = 970,
PetbattleQueueNotWhileNeutral = 971, PetbattleQueueSlotNoPet = 971,
PetbattleGameTimeLimitWarning = 972, PetbattleQueueNotWhileNeutral = 972,
PetbattleGameRoundsLimitWarning = 973, PetbattleGameTimeLimitWarning = 973,
HasRestriction = 974, PetbattleGameRoundsLimitWarning = 974,
ItemUpgradeItemTooLowLevel = 975, HasRestriction = 975,
ItemUpgradeNoPath = 976, ItemUpgradeItemTooLowLevel = 976,
ItemUpgradeNoMoreUpgrades = 977, ItemUpgradeNoPath = 977,
BonusRollEmpty = 978, ItemUpgradeNoMoreUpgrades = 978,
ChallengeModeFull = 979, BonusRollEmpty = 979,
ChallengeModeInProgress = 980, ChallengeModeFull = 980,
ChallengeModeIncorrectKeystone = 981, ChallengeModeInProgress = 981,
BattletagFriendNotFound = 982, ChallengeModeIncorrectKeystone = 982,
BattletagFriendNotValid = 983, BattletagFriendNotFound = 983,
BattletagFriendNotAllowed = 984, BattletagFriendNotValid = 984,
BattletagFriendThrottled = 985, BattletagFriendNotAllowed = 985,
BattletagFriendSuccess = 986, BattletagFriendThrottled = 986,
PetTooHighLevelToUncage = 987, BattletagFriendSuccess = 987,
PetbattleInternal = 988, PetTooHighLevelToUncage = 988,
CantCagePetYet = 989, PetbattleInternal = 989,
NoLootInChallengeMode = 990, CantCagePetYet = 990,
QuestPetBattleVictoriesPvpIi = 991, NoLootInChallengeMode = 991,
RoleCheckAlreadyInProgress = 992, QuestPetBattleVictoriesPvpIi = 992,
RecruitAFriendAccountLimit = 993, RoleCheckAlreadyInProgress = 993,
RecruitAFriendFailed = 994, RecruitAFriendAccountLimit = 994,
SetLootPersonal = 995, RecruitAFriendFailed = 995,
SetLootMethodFailedCombat = 996, SetLootPersonal = 996,
ReagentBankFull = 997, SetLootMethodFailedCombat = 997,
ReagentBankLocked = 998, ReagentBankFull = 998,
GarrisonBuildingExists = 999, ReagentBankLocked = 999,
GarrisonInvalidPlot = 1000, GarrisonBuildingExists = 1000,
GarrisonInvalidBuildingid = 1001, GarrisonInvalidPlot = 1001,
GarrisonInvalidPlotBuilding = 1002, GarrisonInvalidBuildingid = 1002,
GarrisonRequiresBlueprint = 1003, GarrisonInvalidPlotBuilding = 1003,
GarrisonNotEnoughCurrency = 1004, GarrisonRequiresBlueprint = 1004,
GarrisonNotEnoughGold = 1005, GarrisonNotEnoughCurrency = 1005,
GarrisonCompleteMissionWrongFollowerType = 1006, GarrisonNotEnoughGold = 1006,
AlreadyUsingLfgList = 1007, GarrisonCompleteMissionWrongFollowerType = 1007,
RestrictedAccountLfgListTrial = 1008, AlreadyUsingLfgList = 1008,
ToyUseLimitReached = 1009, RestrictedAccountLfgListTrial = 1009,
ToyAlreadyKnown = 1010, ToyUseLimitReached = 1010,
TransmogSetAlreadyKnown = 1011, ToyAlreadyKnown = 1011,
NotEnoughCurrency = 1012, TransmogSetAlreadyKnown = 1012,
SpecIsDisabled = 1013, NotEnoughCurrency = 1013,
FeatureRestrictedTrial = 1014, SpecIsDisabled = 1014,
CantBeObliterated = 1015, FeatureRestrictedTrial = 1015,
CantBeScrapped = 1016, CantBeObliterated = 1016,
CantBeRecrafted = 1017, CantBeScrapped = 1017,
ArtifactRelicDoesNotMatchArtifact = 1018, CantBeRecrafted = 1018,
MustEquipArtifact = 1019, ArtifactRelicDoesNotMatchArtifact = 1019,
CantDoThatRightNow = 1020, MustEquipArtifact = 1020,
AffectingCombat = 1021, CantDoThatRightNow = 1021,
EquipmentManagerCombatSwapS = 1022, AffectingCombat = 1022,
EquipmentManagerBagsFull = 1023, EquipmentManagerCombatSwapS = 1023,
EquipmentManagerMissingItemS = 1024, EquipmentManagerBagsFull = 1024,
MovieRecordingWarningPerf = 1025, EquipmentManagerMissingItemS = 1025,
MovieRecordingWarningDiskFull = 1026, MovieRecordingWarningPerf = 1026,
MovieRecordingWarningNoMovie = 1027, MovieRecordingWarningDiskFull = 1027,
MovieRecordingWarningRequirements = 1028, MovieRecordingWarningNoMovie = 1028,
MovieRecordingWarningCompressing = 1029, MovieRecordingWarningRequirements = 1029,
NoChallengeModeReward = 1030, MovieRecordingWarningCompressing = 1030,
ClaimedChallengeModeReward = 1031, NoChallengeModeReward = 1031,
ChallengeModePeriodResetSs = 1032, ClaimedChallengeModeReward = 1032,
CantDoThatChallengeModeActive = 1033, ChallengeModePeriodResetSs = 1033,
TalentFailedRestArea = 1034, CantDoThatChallengeModeActive = 1034,
CannotAbandonLastPet = 1035, TalentFailedRestArea = 1035,
TestCvarSetSss = 1036, CannotAbandonLastPet = 1036,
QuestTurnInFailReason = 1037, TestCvarSetSss = 1037,
ClaimedChallengeModeRewardOld = 1038, QuestTurnInFailReason = 1038,
TalentGrantedByAura = 1039, ClaimedChallengeModeRewardOld = 1039,
ChallengeModeAlreadyComplete = 1040, TalentGrantedByAura = 1040,
GlyphTargetNotAvailable = 1041, ChallengeModeAlreadyComplete = 1041,
PvpWarmodeToggleOn = 1042, GlyphTargetNotAvailable = 1042,
PvpWarmodeToggleOff = 1043, PvpWarmodeToggleOn = 1043,
SpellFailedLevelRequirement = 1044, PvpWarmodeToggleOff = 1044,
SpellFailedCantFlyHere = 1045, SpellFailedLevelRequirement = 1045,
BattlegroundJoinRequiresLevel = 1046, SpellFailedCantFlyHere = 1046,
BattlegroundJoinDisqualified = 1047, BattlegroundJoinRequiresLevel = 1047,
BattlegroundJoinDisqualifiedNoName = 1048, BattlegroundJoinDisqualified = 1048,
VoiceChatGenericUnableToConnect = 1049, BattlegroundJoinDisqualifiedNoName = 1049,
VoiceChatServiceLost = 1050, VoiceChatGenericUnableToConnect = 1050,
VoiceChatChannelNameTooShort = 1051, VoiceChatServiceLost = 1051,
VoiceChatChannelNameTooLong = 1052, VoiceChatChannelNameTooShort = 1052,
VoiceChatChannelAlreadyExists = 1053, VoiceChatChannelNameTooLong = 1053,
VoiceChatTargetNotFound = 1054, VoiceChatChannelAlreadyExists = 1054,
VoiceChatTooManyRequests = 1055, VoiceChatTargetNotFound = 1055,
VoiceChatPlayerSilenced = 1056, VoiceChatTooManyRequests = 1056,
VoiceChatParentalDisableAll = 1057, VoiceChatPlayerSilenced = 1057,
VoiceChatDisabled = 1058, VoiceChatParentalDisableAll = 1058,
NoPvpReward = 1059, VoiceChatDisabled = 1059,
ClaimedPvpReward = 1060, NoPvpReward = 1060,
AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1061, ClaimedPvpReward = 1061,
AzeriteEssenceSelectionFailedCantRemoveEssence = 1062, AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1062,
AzeriteEssenceSelectionFailedConditionFailed = 1063, AzeriteEssenceSelectionFailedCantRemoveEssence = 1063,
AzeriteEssenceSelectionFailedRestArea = 1064, AzeriteEssenceSelectionFailedConditionFailed = 1064,
AzeriteEssenceSelectionFailedSlotLocked = 1065, AzeriteEssenceSelectionFailedRestArea = 1065,
AzeriteEssenceSelectionFailedNotAtForge = 1066, AzeriteEssenceSelectionFailedSlotLocked = 1066,
AzeriteEssenceSelectionFailedHeartLevelTooLow = 1067, AzeriteEssenceSelectionFailedNotAtForge = 1067,
AzeriteEssenceSelectionFailedNotEquipped = 1068, AzeriteEssenceSelectionFailedHeartLevelTooLow = 1068,
SocketingRequiresPunchcardredGem = 1069, AzeriteEssenceSelectionFailedNotEquipped = 1069,
SocketingPunchcardredGemOnlyInPunchcardredslot = 1070, SocketingRequiresPunchcardredGem = 1070,
SocketingRequiresPunchcardyellowGem = 1071, SocketingPunchcardredGemOnlyInPunchcardredslot = 1071,
SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1072, SocketingRequiresPunchcardyellowGem = 1072,
SocketingRequiresPunchcardblueGem = 1073, SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1073,
SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1074, SocketingRequiresPunchcardblueGem = 1074,
SocketingRequiresDominationShard = 1075, SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1075,
SocketingDominationShardOnlyInDominationslot = 1076, SocketingRequiresDominationShard = 1076,
SocketingRequiresCypherGem = 1077, SocketingDominationShardOnlyInDominationslot = 1077,
SocketingCypherGemOnlyInCypherslot = 1078, SocketingRequiresCypherGem = 1078,
SocketingRequiresTinkerGem = 1079, SocketingCypherGemOnlyInCypherslot = 1079,
SocketingTinkerGemOnlyInTinkerslot = 1080, SocketingRequiresTinkerGem = 1080,
SocketingRequiresPrimordialGem = 1081, SocketingTinkerGemOnlyInTinkerslot = 1081,
SocketingPrimordialGemOnlyInPrimordialslot = 1082, SocketingRequiresPrimordialGem = 1082,
LevelLinkingResultLinked = 1083, SocketingPrimordialGemOnlyInPrimordialslot = 1083,
LevelLinkingResultUnlinked = 1084, LevelLinkingResultLinked = 1084,
ClubFinderErrorPostClub = 1085, LevelLinkingResultUnlinked = 1085,
ClubFinderErrorApplyClub = 1086, ClubFinderErrorPostClub = 1086,
ClubFinderErrorRespondApplicant = 1087, ClubFinderErrorApplyClub = 1087,
ClubFinderErrorCancelApplication = 1088, ClubFinderErrorRespondApplicant = 1088,
ClubFinderErrorTypeAcceptApplication = 1089, ClubFinderErrorCancelApplication = 1089,
ClubFinderErrorTypeNoInvitePermissions = 1090, ClubFinderErrorTypeAcceptApplication = 1090,
ClubFinderErrorTypeNoPostingPermissions = 1091, ClubFinderErrorTypeNoInvitePermissions = 1091,
ClubFinderErrorTypeApplicantList = 1092, ClubFinderErrorTypeNoPostingPermissions = 1092,
ClubFinderErrorTypeApplicantListNoPerm = 1093, ClubFinderErrorTypeApplicantList = 1093,
ClubFinderErrorTypeFinderNotAvailable = 1094, ClubFinderErrorTypeApplicantListNoPerm = 1094,
ClubFinderErrorTypeGetPostingIds = 1095, ClubFinderErrorTypeFinderNotAvailable = 1095,
ClubFinderErrorTypeJoinApplication = 1096, ClubFinderErrorTypeGetPostingIds = 1096,
ClubFinderErrorTypeRealmNotEligible = 1097, ClubFinderErrorTypeJoinApplication = 1097,
ClubFinderErrorTypeFlaggedRename = 1098, ClubFinderErrorTypeRealmNotEligible = 1098,
ClubFinderErrorTypeFlaggedDescriptionChange = 1099, ClubFinderErrorTypeFlaggedRename = 1099,
ItemInteractionNotEnoughGold = 1100, ClubFinderErrorTypeFlaggedDescriptionChange = 1100,
ItemInteractionNotEnoughCurrency = 1101, ItemInteractionNotEnoughGold = 1101,
PlayerChoiceErrorPendingChoice = 1102, ItemInteractionNotEnoughCurrency = 1102,
SoulbindInvalidConduit = 1103, ItemInteractionNoConversionOutput = 1103,
SoulbindInvalidConduitItem = 1104, PlayerChoiceErrorPendingChoice = 1104,
SoulbindInvalidTalent = 1105, SoulbindInvalidConduit = 1105,
SoulbindDuplicateConduit = 1106, SoulbindInvalidConduitItem = 1106,
ActivateSoulbindS = 1107, SoulbindInvalidTalent = 1107,
ActivateSoulbindFailedRestArea = 1108, SoulbindDuplicateConduit = 1108,
CantUseProfanity = 1109, ActivateSoulbindS = 1109,
NotInPetBattle = 1110, ActivateSoulbindFailedRestArea = 1110,
NotInNpe = 1111, CantUseProfanity = 1111,
NoSpec = 1112, NotInPetBattle = 1112,
NoDominationshardOverwrite = 1113, NotInNpe = 1113,
UseWeeklyRewardsDisabled = 1114, NoSpec = 1114,
CrossFactionGroupJoined = 1115, NoDominationshardOverwrite = 1115,
CantTargetUnfriendlyInOverworld = 1116, UseWeeklyRewardsDisabled = 1116,
EquipablespellsSlotsFull = 1117, CrossFactionGroupJoined = 1117,
ItemModAppearanceGroupAlreadyKnown = 1118, CantTargetUnfriendlyInOverworld = 1118,
CantBulkSellItemWithRefund = 1119, EquipablespellsSlotsFull = 1119,
WowLabsPartyErrorTypePartyIsFull = 1120, ItemModAppearanceGroupAlreadyKnown = 1120,
WowLabsPartyErrorTypeMaxInviteSent = 1121, CantBulkSellItemWithRefund = 1121,
WowLabsPartyErrorTypePlayerAlreadyInvited = 1122, WowLabsPartyErrorTypePartyIsFull = 1122,
WowLabsPartyErrorTypePartyInviteInvalid = 1123, WowLabsPartyErrorTypeMaxInviteSent = 1123,
WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1124, WowLabsPartyErrorTypePlayerAlreadyInvited = 1124,
WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1125, WowLabsPartyErrorTypePartyInviteInvalid = 1125,
WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1126,
WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1127
} }
public enum SceneFlags public enum SceneFlags
@@ -551,6 +551,7 @@ namespace Framework.Constants
ModRequiredMountCapabilityFlags = 541, ModRequiredMountCapabilityFlags = 541,
Unk542 = 542, Unk542 = 542,
Unk543 = 543, Unk543 = 543,
Unk544 = 544,
Total Total
} }
@@ -35,25 +35,31 @@ namespace Framework.Database
"subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? "); "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ");
PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?"); PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?");
PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +
"c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " +
PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, " + "WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor, cd.genitive " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid " +
"WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
PrepareStatement(CharStatements.SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " + PrepareStatement(CharStatements.SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " +
"LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID"); "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +
"c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " +
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, " + "WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor, cd.genitive" +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid " +
"WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " + PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " +
"LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID"); "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID");
@@ -71,7 +77,8 @@ namespace Framework.Database
"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " +
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " +
"health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, " + "health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, " +
"raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs, " +
"personalTabardEmblemStyle, personalTabardEmblemColor, personalTabardBorderStyle, personalTabardBorderColor, personalTabardBackgroundColor " +
"FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?"); "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID"); PrepareStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID");
@@ -248,7 +255,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?"); PrepareStatement(CharStatements.DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?");
PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?"); PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?");
PrepareStatement(CharStatements.INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)"); PrepareStatement(CharStatements.INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)");
PrepareStatement(CharStatements.DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?"); PrepareStatement(CharStatements.DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?");
PrepareStatement(CharStatements.DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?"); PrepareStatement(CharStatements.DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?");
PrepareStatement(CharStatements.INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)"); PrepareStatement(CharStatements.INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)");
@@ -312,7 +319,7 @@ namespace Framework.Database
// Equipmentsets // Equipmentsets
PrepareStatement(CharStatements.UPD_EQUIP_SET, "UPDATE character_equipmentsets SET name=?, iconname=?, ignore_mask=?, AssignedSpecIndex=?, item0=?, item1=?, item2=?, item3=?, " + PrepareStatement(CharStatements.UPD_EQUIP_SET, "UPDATE character_equipmentsets SET name=?, iconname=?, ignore_mask=?, AssignedSpecIndex=?, item0=?, item1=?, item2=?, item3=?, " +
"item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, " + "item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, " +
"item17=?, item18=? WHERE guid=? AND setguid=? AND setindex=?"); "item17=?, item18=? WHERE guid=? AND setguid=? AND setindex=?");
PrepareStatement(CharStatements.INS_EQUIP_SET, "INSERT INTO character_equipmentsets (guid, setguid, setindex, name, iconname, ignore_mask, AssignedSpecIndex, item0, item1, item2, item3, " + PrepareStatement(CharStatements.INS_EQUIP_SET, "INSERT INTO character_equipmentsets (guid, setguid, setindex, name, iconname, ignore_mask, AssignedSpecIndex, item0, item1, item2, item3, " +
"item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) " + "item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) " +
@@ -270,13 +270,13 @@ namespace Framework.Database
// ChrCustomizationDisplayInfo.db2 // ChrCustomizationDisplayInfo.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " + PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " +
"BarberShopHeightOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?"); "BarberShopHeightOffset, BarberShopCameraZoomOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?");
// ChrCustomizationElement.db2 // ChrCustomizationElement.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " + PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " +
"ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " + "ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " +
"ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID, ParticleColorID" + "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID, ParticleColorID, " +
" FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?"); "ChrCustGeoComponentLinkID FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?");
// ChrCustomizationOption.db2 // ChrCustomizationOption.db2
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " + PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " +
@@ -357,8 +357,8 @@ namespace Framework.Database
" WHERE (`VerifiedBuild` > 0) = ?"); " WHERE (`VerifiedBuild` > 0) = ?");
// ConversationLine.db2 // ConversationLine.db2
PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " + PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, Unused1020, SpellVisualKitID, AdditionalDuration, " +
"AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?"); "NextConversationLineID, AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?");
// CorruptionEffects.db2 // CorruptionEffects.db2
PrepareStatement(HotfixStatements.SEL_CORRUPTION_EFFECTS, "SELECT ID, MinCorruption, Aura, PlayerConditionID, Flags FROM corruption_effects" + PrepareStatement(HotfixStatements.SEL_CORRUPTION_EFFECTS, "SELECT ID, MinCorruption, Aura, PlayerConditionID, Flags FROM corruption_effects" +
@@ -1121,6 +1121,10 @@ namespace Framework.Database
// SceneScriptText.db2 // SceneScriptText.db2
PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text WHERE (`VerifiedBuild` > 0) = ?");
// ServerMessages.db2
PrepareStatement(HotfixStatements.SEL_SERVER_MESSAGES, "SELECT ID, `Text` FROM server_messages WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SERVER_MESSAGES_LOCALE, "SELECT ID, Text_lang FROM server_messages_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?");
// SkillLine.db2 // SkillLine.db2
PrepareStatement(HotfixStatements.SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " + PrepareStatement(HotfixStatements.SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " +
"CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID, ExpansionNameSharedStringID, " + "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID, ExpansionNameSharedStringID, " +
@@ -1305,10 +1309,9 @@ namespace Framework.Database
"ShapeshiftMask2 FROM spell_shapeshift WHERE (`VerifiedBuild` > 0) = ?"); "ShapeshiftMask2 FROM spell_shapeshift WHERE (`VerifiedBuild` > 0) = ?");
// SpellShapeshiftForm.db2 // SpellShapeshiftForm.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureType, Flags, AttackIconFileID, BonusActionBar, CombatRoundTime, " + PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureDisplayID, CreatureType, Flags, AttackIconFileID, BonusActionBar, " +
"DamageVariance, MountTypeID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, " + "CombatRoundTime, DamageVariance, MountTypeID, PresetSpellID1, PresetSpellID2, PresetSpellID3, PresetSpellID4, PresetSpellID5, " +
"PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form" + "PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form WHERE (`VerifiedBuild` > 0) = ?");
" WHERE (`VerifiedBuild` > 0) = ?");
PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM_LOCALE, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE (`VerifiedBuild` > 0) = ?" + PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM_LOCALE, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE (`VerifiedBuild` > 0) = ?" +
" AND locale = ?"); " AND locale = ?");
@@ -2119,6 +2122,9 @@ namespace Framework.Database
SEL_SCENE_SCRIPT_TEXT, SEL_SCENE_SCRIPT_TEXT,
SEL_SERVER_MESSAGES,
SEL_SERVER_MESSAGES_LOCALE,
SEL_SKILL_LINE, SEL_SKILL_LINE,
SEL_SKILL_LINE_LOCALE, SEL_SKILL_LINE_LOCALE,
+29 -11
View File
@@ -153,6 +153,7 @@ namespace Game.Achievements
case CriteriaType.DamageDealt: case CriteriaType.DamageDealt:
case CriteriaType.HealingDone: case CriteriaType.HealingDone:
case CriteriaType.EarnArtifactXPForAzeriteItem: case CriteriaType.EarnArtifactXPForAzeriteItem:
case CriteriaType.GainLevels:
SetCriteriaProgress(criteria, miscValue1, referencePlayer, ProgressType.Accumulate); SetCriteriaProgress(criteria, miscValue1, referencePlayer, ProgressType.Accumulate);
break; break;
case CriteriaType.KillCreature: case CriteriaType.KillCreature:
@@ -458,7 +459,7 @@ namespace Game.Achievements
} }
else else
_startedCriteria[key] -= timeDiff; _startedCriteria[key] -= timeDiff;
} }
} }
public void StartCriteria(CriteriaStartEvent startEvent, uint entry, TimeSpan timeLost = default) public void StartCriteria(CriteriaStartEvent startEvent, uint entry, TimeSpan timeLost = default)
@@ -799,6 +800,7 @@ namespace Game.Achievements
case CriteriaType.CompleteAnyReplayQuest: case CriteriaType.CompleteAnyReplayQuest:
case CriteriaType.BuyItemsFromVendors: case CriteriaType.BuyItemsFromVendors:
case CriteriaType.SellItemsToVendors: case CriteriaType.SellItemsToVendors:
case CriteriaType.GainLevels:
return progress.Counter >= requiredAmount; return progress.Counter >= requiredAmount;
case CriteriaType.EarnAchievement: case CriteriaType.EarnAchievement:
case CriteriaType.CompleteQuest: case CriteriaType.CompleteQuest:
@@ -932,6 +934,7 @@ namespace Game.Achievements
case CriteriaType.CompleteAnyReplayQuest: case CriteriaType.CompleteAnyReplayQuest:
case CriteriaType.BuyItemsFromVendors: case CriteriaType.BuyItemsFromVendors:
case CriteriaType.SellItemsToVendors: case CriteriaType.SellItemsToVendors:
case CriteriaType.GainLevels:
if (miscValue1 == 0) if (miscValue1 == 0)
return false; return false;
break; break;
@@ -3291,6 +3294,15 @@ namespace Game.Achievements
case 149: // Shadowlands Season 2 End case 149: // Shadowlands Season 2 End
// timestamp = unknown // timestamp = unknown
break; break;
case 349: // Dragonflight Season 3 Start (pre-season)
eventTimestamp = 1699340400L; // November 7, 2023 8:00
break;
case 350: // Dragonflight Season 3 Start
eventTimestamp = 1699945200L; // November 14, 2023 8:00
break;
case 352: // Dragonflight Season 3 End
// eventTimestamp = time_t(); unknown
break;
default: default:
break; break;
} }
@@ -3668,6 +3680,13 @@ namespace Game.Achievements
if (referencePlayer.GetPositionZ() >= reqValue) if (referencePlayer.GetPositionZ() >= reqValue)
return false; return false;
break; break;
case ModifierTreeType.PlayerIsOnMapWithExpansion: // 380
{
var mapEntry = referencePlayer.GetMap().GetEntry();
if (mapEntry.ExpansionID != reqValue)
return false;
break;
}
default: default:
return false; return false;
} }
@@ -3706,8 +3725,8 @@ namespace Game.Achievements
MultiMap<uint, Criteria>[] _scenarioCriteriasByTypeAndScenarioId = new MultiMap<uint, Criteria>[(int)CriteriaType.Count]; MultiMap<uint, Criteria>[] _scenarioCriteriasByTypeAndScenarioId = new MultiMap<uint, Criteria>[(int)CriteriaType.Count];
MultiMap<CriteriaType, Criteria> _questObjectiveCriteriasByType = new(); MultiMap<CriteriaType, Criteria> _questObjectiveCriteriasByType = new();
MultiMap<int, Criteria>[] _criteriasByStartEvent = new MultiMap<int, Criteria>[(int)CriteriaStartEvent.Max]; MultiMap<int, Criteria>[] _criteriasByStartEvent = new MultiMap<int, Criteria>[(int)CriteriaStartEvent.Count];
MultiMap<int, Criteria>[] _criteriasByFailEvent = new MultiMap<int, Criteria>[(int)CriteriaFailEvent.Max]; MultiMap<int, Criteria>[] _criteriasByFailEvent = new MultiMap<int, Criteria>[(int)CriteriaFailEvent.Count];
CriteriaManager() CriteriaManager()
{ {
@@ -3717,10 +3736,10 @@ namespace Game.Achievements
_scenarioCriteriasByTypeAndScenarioId[i] = new MultiMap<uint, Criteria>(); _scenarioCriteriasByTypeAndScenarioId[i] = new MultiMap<uint, Criteria>();
} }
for (var i = 0; i < (int)CriteriaStartEvent.Max; ++i) for (var i = 0; i < (int)CriteriaStartEvent.Count; ++i)
_criteriasByStartEvent[i] = new(); _criteriasByStartEvent[i] = new();
for (var i = 0; i < (int)CriteriaFailEvent.Max; ++i) for (var i = 0; i < (int)CriteriaFailEvent.Count; ++i)
_criteriasByFailEvent[i] = new(); _criteriasByFailEvent[i] = new();
} }
@@ -3836,7 +3855,7 @@ namespace Game.Achievements
_criteriaTreeByCriteria.Add(pair.Value.Entry.CriteriaID, pair.Value); _criteriaTreeByCriteria.Add(pair.Value.Entry.CriteriaID, pair.Value);
} }
for (var i = 0; i < (int)CriteriaFailEvent.Max; ++i) for (var i = 0; i < (int)CriteriaFailEvent.Count; ++i)
_criteriasByFailEvent[i] = new MultiMap<int, Criteria>(); _criteriasByFailEvent[i] = new MultiMap<int, Criteria>();
// Load criteria // Load criteria
@@ -3846,10 +3865,9 @@ namespace Game.Achievements
uint questObjectiveCriterias = 0; uint questObjectiveCriterias = 0;
foreach (CriteriaRecord criteriaEntry in CliDB.CriteriaStorage.Values) foreach (CriteriaRecord criteriaEntry in CliDB.CriteriaStorage.Values)
{ {
Cypher.Assert(criteriaEntry.Type < CriteriaType.Count, Cypher.Assert(criteriaEntry.Type < CriteriaType.Count, $"CriteriaType.Count must be greater than or equal to {criteriaEntry.Type + 1} but is currently equal to {CriteriaType.Count}");
$"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.Type + 1} but is currently equal to {CriteriaType.Count}"); Cypher.Assert(criteriaEntry.StartEvent < (byte)CriteriaStartEvent.Count, $"CriteriaStartEvent.Count must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaStartEvent.Count}");
Cypher.Assert(criteriaEntry.StartEvent < (byte)CriteriaStartEvent.Max, $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaStartEvent.Max}"); Cypher.Assert(criteriaEntry.FailEvent < (byte)CriteriaFailEvent.Count, $"CriteriaFailEvent.Count must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaFailEvent.Count}");
Cypher.Assert(criteriaEntry.FailEvent < (byte)CriteriaFailEvent.Max, $"CRITERIA_CONDITION_MAX must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaFailEvent.Max}");
var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id); var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id);
if (treeList.Empty()) if (treeList.Empty())
@@ -4086,7 +4104,7 @@ namespace Game.Achievements
{ {
return _criteriasByFailEvent[(int)failEvent].LookupByKey(asset); return _criteriasByFailEvent[(int)failEvent].LookupByKey(asset);
} }
public List<Criteria> GetGuildCriteriaByType(CriteriaType type) public List<Criteria> GetGuildCriteriaByType(CriteriaType type)
{ {
return _guildCriteriasByType.LookupByKey(type); return _guildCriteriasByType.LookupByKey(type);
+2
View File
@@ -281,6 +281,7 @@ namespace Game.DataStorage
SceneScriptGlobalTextStorage = ReadDB2<SceneScriptGlobalTextRecord>("SceneScriptGlobalText.db2", HotfixStatements.SEL_SCENE_SCRIPT_GLOBAL_TEXT); SceneScriptGlobalTextStorage = ReadDB2<SceneScriptGlobalTextRecord>("SceneScriptGlobalText.db2", HotfixStatements.SEL_SCENE_SCRIPT_GLOBAL_TEXT);
SceneScriptPackageStorage = ReadDB2<SceneScriptPackageRecord>("SceneScriptPackage.db2", HotfixStatements.SEL_SCENE_SCRIPT_PACKAGE); SceneScriptPackageStorage = ReadDB2<SceneScriptPackageRecord>("SceneScriptPackage.db2", HotfixStatements.SEL_SCENE_SCRIPT_PACKAGE);
SceneScriptTextStorage = ReadDB2<SceneScriptTextRecord>("SceneScriptText.db2", HotfixStatements.SEL_SCENE_SCRIPT_TEXT); SceneScriptTextStorage = ReadDB2<SceneScriptTextRecord>("SceneScriptText.db2", HotfixStatements.SEL_SCENE_SCRIPT_TEXT);
ServerMessagesStorage = ReadDB2<ServerMessagesRecord>("ServerMessages.db2", HotfixStatements.SEL_SERVER_MESSAGES, HotfixStatements.SEL_SERVER_MESSAGES_LOCALE);
SkillLineStorage = ReadDB2<SkillLineRecord>("SkillLine.db2", HotfixStatements.SEL_SKILL_LINE, HotfixStatements.SEL_SKILL_LINE_LOCALE); SkillLineStorage = ReadDB2<SkillLineRecord>("SkillLine.db2", HotfixStatements.SEL_SKILL_LINE, HotfixStatements.SEL_SKILL_LINE_LOCALE);
SkillLineAbilityStorage = ReadDB2<SkillLineAbilityRecord>("SkillLineAbility.db2", HotfixStatements.SEL_SKILL_LINE_ABILITY); SkillLineAbilityStorage = ReadDB2<SkillLineAbilityRecord>("SkillLineAbility.db2", HotfixStatements.SEL_SKILL_LINE_ABILITY);
SkillLineXTraitTreeStorage = ReadDB2<SkillLineXTraitTreeRecord>("SkillLineXTraitTree.db2", HotfixStatements.SEL_SKILL_LINE_X_TRAIT_TREE); SkillLineXTraitTreeStorage = ReadDB2<SkillLineXTraitTreeRecord>("SkillLineXTraitTree.db2", HotfixStatements.SEL_SKILL_LINE_X_TRAIT_TREE);
@@ -715,6 +716,7 @@ namespace Game.DataStorage
public static DB6Storage<SceneScriptGlobalTextRecord> SceneScriptGlobalTextStorage; public static DB6Storage<SceneScriptGlobalTextRecord> SceneScriptGlobalTextStorage;
public static DB6Storage<SceneScriptPackageRecord> SceneScriptPackageStorage; public static DB6Storage<SceneScriptPackageRecord> SceneScriptPackageStorage;
public static DB6Storage<SceneScriptTextRecord> SceneScriptTextStorage; public static DB6Storage<SceneScriptTextRecord> SceneScriptTextStorage;
public static DB6Storage<ServerMessagesRecord> ServerMessagesStorage;
public static DB6Storage<SkillLineRecord> SkillLineStorage; public static DB6Storage<SkillLineRecord> SkillLineStorage;
public static DB6Storage<SkillLineAbilityRecord> SkillLineAbilityStorage; public static DB6Storage<SkillLineAbilityRecord> SkillLineAbilityStorage;
public static DB6Storage<SkillLineXTraitTreeRecord> SkillLineXTraitTreeStorage; public static DB6Storage<SkillLineXTraitTreeRecord> SkillLineXTraitTreeStorage;
+1 -1
View File
@@ -146,7 +146,7 @@ namespace Game.DataStorage
public Vector3 Pos; public Vector3 Pos;
public uint Id; public uint Id;
public ushort ContinentID; public ushort ContinentID;
public sbyte PhaseUseFlags; public int PhaseUseFlags;
public ushort PhaseID; public ushort PhaseID;
public ushort PhaseGroupID; public ushort PhaseGroupID;
public float Radius; public float Radius;
@@ -163,6 +163,7 @@ namespace Game.DataStorage
public uint DisplayID; public uint DisplayID;
public float BarberShopMinCameraDistance; public float BarberShopMinCameraDistance;
public float BarberShopHeightOffset; public float BarberShopHeightOffset;
public float BarberShopCameraZoomOffset;
} }
public sealed class ChrCustomizationElementRecord public sealed class ChrCustomizationElementRecord
@@ -180,6 +181,7 @@ namespace Game.DataStorage
public int ChrCustomizationVoiceID; public int ChrCustomizationVoiceID;
public int AnimKitID; public int AnimKitID;
public int ParticleColorID; public int ParticleColorID;
public int ChrCustGeoComponentLinkID;
} }
public sealed class ChrCustomizationOptionRecord public sealed class ChrCustomizationOptionRecord
@@ -422,6 +424,7 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public uint BroadcastTextID; public uint BroadcastTextID;
public uint Unused1020;
public uint SpellVisualKitID; public uint SpellVisualKitID;
public int AdditionalDuration; public int AdditionalDuration;
public ushort NextConversationLineID; public ushort NextConversationLineID;
+1 -1
View File
@@ -234,7 +234,7 @@ namespace Game.DataStorage
public byte KeyID; public byte KeyID;
public uint AudioFileDataID; public uint AudioFileDataID;
public uint SubtitleFileDataID; public uint SubtitleFileDataID;
public int SubtitleFileFormat; public uint SubtitleFileFormat;
} }
public sealed class MythicPlusSeasonRecord public sealed class MythicPlusSeasonRecord
+1 -1
View File
@@ -66,7 +66,7 @@ namespace Game.DataStorage
public int MaxAvgItemLevel; public int MaxAvgItemLevel;
public ushort MinAvgEquippedItemLevel; public ushort MinAvgEquippedItemLevel;
public ushort MaxAvgEquippedItemLevel; public ushort MaxAvgEquippedItemLevel;
public byte PhaseUseFlags; public int PhaseUseFlags;
public ushort PhaseID; public ushort PhaseID;
public uint PhaseGroupID; public uint PhaseGroupID;
public int Flags; public int Flags;
+7 -1
View File
@@ -68,6 +68,12 @@ namespace Game.DataStorage
public string Script; public string Script;
} }
public sealed class ServerMessagesRecord
{
public uint Id;
public LocalizedString Text;
}
public sealed class SkillLineRecord public sealed class SkillLineRecord
{ {
public LocalizedString DisplayName; public LocalizedString DisplayName;
@@ -544,6 +550,7 @@ namespace Game.DataStorage
{ {
public uint Id; public uint Id;
public string Name; public string Name;
public uint CreatureDisplayID;
public sbyte CreatureType; public sbyte CreatureType;
public SpellShapeshiftFormFlags Flags; public SpellShapeshiftFormFlags Flags;
public int AttackIconFileID; public int AttackIconFileID;
@@ -551,7 +558,6 @@ namespace Game.DataStorage
public ushort CombatRoundTime; public ushort CombatRoundTime;
public float DamageVariance; public float DamageVariance;
public ushort MountTypeID; public ushort MountTypeID;
public uint[] CreatureDisplayID = new uint[4];
public uint[] PresetSpellID = new uint[SpellConst.MaxShapeshift]; public uint[] PresetSpellID = new uint[SpellConst.MaxShapeshift];
} }
+1 -1
View File
@@ -12,7 +12,7 @@ namespace Game.DataStorage
public uint Id; public uint Id;
public int ParentUiMapID; public int ParentUiMapID;
public int Flags; public int Flags;
public byte System; public sbyte System;
public UiMapType Type; public UiMapType Type;
public int BountySetID; public int BountySetID;
public uint BountyDisplayLocation; public uint BountyDisplayLocation;
+3 -2
View File
@@ -127,15 +127,16 @@ namespace Game.Entities
if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.ConversationLine, line.Id, creator)) if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.ConversationLine, line.Id, creator))
continue; continue;
var convoLine = CliDB.ConversationLineStorage.LookupByKey(line.Id); // never null for conversationTemplate->Lines
ConversationLine lineField = new(); ConversationLine lineField = new();
lineField.ConversationLineID = line.Id; lineField.ConversationLineID = line.Id;
lineField.BroadcastTextID = convoLine.BroadcastTextID;
lineField.UiCameraID = line.UiCameraID; lineField.UiCameraID = line.UiCameraID;
lineField.ActorIndex = line.ActorIdx; lineField.ActorIndex = line.ActorIdx;
lineField.Flags = line.Flags; lineField.Flags = line.Flags;
lineField.ChatType = line.ChatType; lineField.ChatType = line.ChatType;
ConversationLineRecord convoLine = CliDB.ConversationLineStorage.LookupByKey(line.Id); // never null for conversationTemplate->Lines
for (Locale locale = Locale.enUS; locale < Locale.Total; locale = locale + 1) for (Locale locale = Locale.enUS; locale < Locale.Total; locale = locale + 1)
{ {
if (locale == Locale.None) if (locale == Locale.None)
@@ -126,6 +126,43 @@ namespace Game.Entities
public bool HasValue() { return _hasValue; } public bool HasValue() { return _hasValue; }
} }
public class UpdateFieldArrayString
{
public string[] _values;
public int FirstElementBit;
public int Bit;
public UpdateFieldArrayString(uint size, int bit, int firstElementBit)
{
_values = new string[size];
for (var i = 0; i < size; ++i)
_values[i] = "";
Bit = bit;
FirstElementBit = firstElementBit;
}
public string this[int index]
{
get
{
return _values[index];
}
set
{
_values[index] = value;
}
}
public int GetSize() { return _values.Length; }
public IEnumerator<string> GetEnumerator()
{
foreach (var obj in _values)
yield return obj;
}
}
public class UpdateFieldArray<T> where T : new() public class UpdateFieldArray<T> where T : new()
{ {
public T[] _values; public T[] _values;
@@ -404,6 +441,8 @@ namespace Game.Entities
} }
} }
public void ClearChangesMask(UpdateFieldArrayString updateField) { }
public void ClearChangesMask<U>(DynamicUpdateField<U> updateField) where U : new() public void ClearChangesMask<U>(DynamicUpdateField<U> updateField) where U : new()
{ {
if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U)))
@@ -421,24 +460,30 @@ namespace Game.Entities
return updateField; return updateField;
} }
public OptionalUpdateField<U> ModifyValue<U>(OptionalUpdateField<U> updateField) where U : new()
{
MarkChanged(updateField);
return updateField;
}
public UpdateFieldString ModifyValue(UpdateFieldString updateField) public UpdateFieldString ModifyValue(UpdateFieldString updateField)
{ {
MarkChanged(updateField); MarkChanged(updateField);
return updateField; return updateField;
} }
public OptionalUpdateField<U> ModifyValue<U>(OptionalUpdateField<U> updateField) where U : new()
{
MarkChanged(updateField);
return updateField;
}
public ref U ModifyValue<U>(UpdateFieldArray<U> updateField, int index) where U : new() public ref U ModifyValue<U>(UpdateFieldArray<U> updateField, int index) where U : new()
{ {
MarkChanged(updateField, index); MarkChanged(updateField, index);
return ref updateField._values[index]; return ref updateField._values[index];
} }
public ref string ModifyValue(UpdateFieldArrayString updateField, int index)
{
MarkChanged(updateField, index);
return ref updateField._values[index];
}
public DynamicUpdateField<U> ModifyValue<U>(DynamicUpdateField<U> updateField) where U : new() public DynamicUpdateField<U> ModifyValue<U>(DynamicUpdateField<U> updateField) where U : new()
{ {
_changesMask.Set(updateField.BlockBit); _changesMask.Set(updateField.BlockBit);
@@ -486,6 +531,12 @@ namespace Game.Entities
_changesMask.Set(updateField.FirstElementBit + index); _changesMask.Set(updateField.FirstElementBit + index);
} }
public void MarkChanged(UpdateFieldArrayString updateField, int index)
{
_changesMask.Set(updateField.Bit);
_changesMask.Set(updateField.FirstElementBit + index);
}
public void WriteCompleteDynamicFieldUpdateMask(int size, WorldPacket data, int bitsForSize = 32) public void WriteCompleteDynamicFieldUpdateMask(int size, WorldPacket data, int bitsForSize = 32)
{ {
data.WriteBits(size, bitsForSize); data.WriteBits(size, bitsForSize);
File diff suppressed because it is too large Load Diff
@@ -832,6 +832,15 @@ namespace Game.Entities
} }
} }
public void SetUpdateFieldValue(ref string value, string newValue)
{
if (!newValue.Equals(value))
{
value = newValue;
AddToObjectUpdateIfNeeded();
}
}
public void SetUpdateFieldValue<T>(DynamicUpdateField<T> updateField, int index, T newValue) where T : new() public void SetUpdateFieldValue<T>(DynamicUpdateField<T> updateField, int index, T newValue) where T : new()
{ {
if (!newValue.Equals(updateField[index])) if (!newValue.Equals(updateField[index]))
+17 -10
View File
@@ -465,7 +465,7 @@ namespace Game.Entities
do do
{ {
var spell = m_spells.LookupByKey(favoritesResult.Read<uint>(0)); var spell = m_spells.LookupByKey(favoritesResult.Read<uint>(0));
if (spell !=null) if (spell != null)
spell.Favorite = true; spell.Favorite = true;
} while (favoritesResult.NextRow()); } while (favoritesResult.NextRow());
} }
@@ -1388,9 +1388,9 @@ namespace Game.Entities
if (result.IsEmpty()) if (result.IsEmpty())
return; return;
_declinedname = new DeclinedName(); DeclinedNames declinedNames = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.DeclinedNames);
for (byte i = 0; i < SharedConst.MaxDeclinedNameCases; ++i) for (int i = 0; i < SharedConst.MaxDeclinedNameCases; ++i)
_declinedname.name[i] = result.Read<string>(i); SetUpdateFieldValue(ref declinedNames.ModifyValue(declinedNames.Name, i), result.Read<string>(i));
} }
void _LoadArenaTeamInfo(SQLResult result) void _LoadArenaTeamInfo(SQLResult result)
{ {
@@ -2047,7 +2047,7 @@ namespace Game.Entities
void _SaveActions(SQLTransaction trans) void _SaveActions(SQLTransaction trans)
{ {
int traitConfigId = 0; int traitConfigId = 0;
TraitConfig traitConfig = GetTraitConfig((int)(uint)m_activePlayerData.ActiveCombatTraitConfigID); TraitConfig traitConfig = GetTraitConfig((int)(uint)m_activePlayerData.ActiveCombatTraitConfigID);
if (traitConfig != null) if (traitConfig != null)
{ {
@@ -2430,7 +2430,7 @@ namespace Game.Entities
m_traitConfigStates.Clear(); m_traitConfigStates.Clear();
} }
public void _SaveMail(SQLTransaction trans) public void _SaveMail(SQLTransaction trans)
{ {
PreparedStatement stmt; PreparedStatement stmt;
@@ -2863,7 +2863,11 @@ namespace Game.Entities
PlayerRestState honorRestState = (PlayerRestState)result.Read<byte>(fieldIndex++); PlayerRestState honorRestState = (PlayerRestState)result.Read<byte>(fieldIndex++);
float honorRestBonus = result.Read<float>(fieldIndex++); float honorRestBonus = result.Read<float>(fieldIndex++);
byte numRespecs = result.Read<byte>(fieldIndex++); byte numRespecs = result.Read<byte>(fieldIndex++);
int personalTabardEmblemStyle = result.Read<int>(fieldIndex++);
int personalTabardEmblemColor = result.Read<int>(fieldIndex++);
int personalTabardBorderStyle = result.Read<int>(fieldIndex++);
int personalTabardBorderColor = result.Read<int>(fieldIndex++);
int personalTabardBackgroundColor = result.Read<int>(fieldIndex++);
// check if the character's account in the db and the logged in account match. // check if the character's account in the db and the logged in account match.
// player should be able to load/delete character only with correct account! // player should be able to load/delete character only with correct account!
@@ -2895,9 +2899,10 @@ namespace Game.Entities
return false; return false;
} }
SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Name), GetName());
SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.WowAccount), GetSession().GetAccountGUID()); SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.WowAccount), GetSession().GetAccountGUID());
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BnetAccount), GetSession().GetBattlenetAccountGUID()); SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.BnetAccount), GetSession().GetBattlenetAccountGUID());
if (gender >= Gender.None) if (gender >= Gender.None)
{ {
@@ -3099,7 +3104,7 @@ namespace Game.Entities
transport = transportOnMap; transport = transportOnMap;
} }
} }
if (transport != null) if (transport != null)
{ {
float x = trans_x; float x = trans_x;
@@ -3217,7 +3222,7 @@ namespace Game.Entities
else if (map.IsDungeon()) // if map is dungeon... else if (map.IsDungeon()) // if map is dungeon...
{ {
TransferAbortParams denyReason = map.CannotEnter(this); // ... and can't enter map, then look for entry point. TransferAbortParams denyReason = map.CannotEnter(this); // ... and can't enter map, then look for entry point.
if (denyReason != null) if (denyReason != null)
{ {
SendTransferAborted(map.GetId(), denyReason.Reason, denyReason.Arg, denyReason.MapDifficultyXConditionId); SendTransferAborted(map.GetId(), denyReason.Reason, denyReason.Arg, denyReason.MapDifficultyXConditionId);
areaTrigger = Global.ObjectMgr.GetGoBackTrigger(mapId); areaTrigger = Global.ObjectMgr.GetGoBackTrigger(mapId);
@@ -3460,6 +3465,8 @@ namespace Game.Entities
} }
} }
SetPersonalTabard(personalTabardEmblemStyle, personalTabardEmblemColor, personalTabardBorderStyle, personalTabardBorderColor, personalTabardBackgroundColor);
Log.outDebug(LogFilter.Player, "The value of player {0} after load item and aura is: ", GetName()); Log.outDebug(LogFilter.Player, "The value of player {0} after load item and aura is: ", GetName());
// GM state // GM state
@@ -237,7 +237,6 @@ namespace Game.Entities
TimeTracker m_groupUpdateTimer; TimeTracker m_groupUpdateTimer;
ulong m_GuildIdInvited; ulong m_GuildIdInvited;
DeclinedName _declinedname;
Runes m_runes = new(); Runes m_runes = new();
uint m_hostileReferenceCheckTimer; uint m_hostileReferenceCheckTimer;
uint m_drunkTimer; uint m_drunkTimer;
+27 -14
View File
@@ -138,7 +138,6 @@ namespace Game.Entities
PlayerTalkClass.ClearMenus(); PlayerTalkClass.ClearMenus();
ItemSetEff.Clear(); ItemSetEff.Clear();
_declinedname = null;
m_runes = null; m_runes = null;
m_achievementSys = null; m_achievementSys = null;
reputationMgr = null; reputationMgr = null;
@@ -816,7 +815,7 @@ namespace Game.Entities
_session.SendPacket(data); _session.SendPacket(data);
} }
public DeclinedName GetDeclinedNames() { return _declinedname; } public DeclinedNames GetDeclinedNames() { return m_playerData.DeclinedNames.HasValue() ? m_playerData.DeclinedNames.GetValue() : null; }
public void CreateGarrison(uint garrSiteId) public void CreateGarrison(uint garrSiteId)
{ {
@@ -1040,7 +1039,7 @@ namespace Game.Entities
if (!m_activePlayerData.PetStable.HasValue()) if (!m_activePlayerData.PetStable.HasValue())
return ObjectGuid.Empty; return ObjectGuid.Empty;
return m_activePlayerData.PetStable.GetValue().StableMaster; return m_activePlayerData.PetStable.GetValue().StableMaster;
} }
public void SetStableMaster(ObjectGuid stableMaster) public void SetStableMaster(ObjectGuid stableMaster)
@@ -1051,7 +1050,7 @@ namespace Game.Entities
StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable); StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable);
SetUpdateFieldValue(stableInfo.ModifyValue(stableInfo.StableMaster), stableMaster); SetUpdateFieldValue(stableInfo.ModifyValue(stableInfo.StableMaster), stableMaster);
} }
// last used pet number (for BG's) // last used pet number (for BG's)
public uint GetLastPetNumber() { return m_lastpetnumber; } public uint GetLastPetNumber() { return m_lastpetnumber; }
public void SetLastPetNumber(uint petnumber) { m_lastpetnumber = petnumber; } public void SetLastPetNumber(uint petnumber) { m_lastpetnumber = petnumber; }
@@ -1059,7 +1058,7 @@ namespace Game.Entities
public void SetTemporaryUnsummonedPetNumber(uint petnumber) { m_temporaryUnsummonedPetNumber = petnumber; } public void SetTemporaryUnsummonedPetNumber(uint petnumber) { m_temporaryUnsummonedPetNumber = petnumber; }
public ReactStates? GetTemporaryPetReactState() { return m_temporaryPetReactState; } public ReactStates? GetTemporaryPetReactState() { return m_temporaryPetReactState; }
public void DisablePetControlsOnMount(ReactStates reactState, CommandStates commandState) public void DisablePetControlsOnMount(ReactStates reactState, CommandStates commandState)
{ {
Pet pet = GetPet(); Pet pet = GetPet();
@@ -2667,11 +2666,12 @@ namespace Game.Entities
case GossipOptionNpc.Binder: case GossipOptionNpc.Binder:
case GossipOptionNpc.Banker: case GossipOptionNpc.Banker:
case GossipOptionNpc.PetitionVendor: case GossipOptionNpc.PetitionVendor:
case GossipOptionNpc.TabardVendor: case GossipOptionNpc.GuildTabardVendor:
case GossipOptionNpc.Auctioneer: case GossipOptionNpc.Auctioneer:
case GossipOptionNpc.Mailbox: case GossipOptionNpc.Mailbox:
case GossipOptionNpc.Transmogrify: case GossipOptionNpc.Transmogrify:
case GossipOptionNpc.AzeriteRespec: case GossipOptionNpc.AzeriteRespec:
case GossipOptionNpc.PersonalTabardVendor:
break; // No checks break; // No checks
case GossipOptionNpc.CemeterySelect: case GossipOptionNpc.CemeterySelect:
canTalk = false; // Deprecated canTalk = false; // Deprecated
@@ -2887,7 +2887,7 @@ namespace Game.Entities
{ {
PlayerInteractionType.None, PlayerInteractionType.Vendor, PlayerInteractionType.TaxiNode, PlayerInteractionType.None, PlayerInteractionType.Vendor, PlayerInteractionType.TaxiNode,
PlayerInteractionType.Trainer, PlayerInteractionType.SpiritHealer, PlayerInteractionType.Binder, PlayerInteractionType.Trainer, PlayerInteractionType.SpiritHealer, PlayerInteractionType.Binder,
PlayerInteractionType.Banker, PlayerInteractionType.PetitionVendor, PlayerInteractionType.TabardVendor, PlayerInteractionType.Banker, PlayerInteractionType.PetitionVendor, PlayerInteractionType.GuildTabardVendor,
PlayerInteractionType.BattleMaster, PlayerInteractionType.Auctioneer, PlayerInteractionType.TalentMaster, PlayerInteractionType.BattleMaster, PlayerInteractionType.Auctioneer, PlayerInteractionType.TalentMaster,
PlayerInteractionType.StableMaster, PlayerInteractionType.None, PlayerInteractionType.GuildBanker, PlayerInteractionType.StableMaster, PlayerInteractionType.None, PlayerInteractionType.GuildBanker,
PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None,
@@ -2902,7 +2902,8 @@ namespace Game.Entities
PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.NewPlayerGuide, PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.NewPlayerGuide, PlayerInteractionType.LegendaryCrafting,
PlayerInteractionType.Renown, PlayerInteractionType.BlackMarketAuctioneer, PlayerInteractionType.PerksProgramVendor, PlayerInteractionType.Renown, PlayerInteractionType.BlackMarketAuctioneer, PlayerInteractionType.PerksProgramVendor,
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 interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc]; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc];
@@ -4313,9 +4314,9 @@ namespace Game.Entities
} }
ObjectGuid GetSpiritHealerGUID() { return _areaSpiritHealerGUID; } ObjectGuid GetSpiritHealerGUID() { return _areaSpiritHealerGUID; }
public bool CanAcceptAreaSpiritHealFrom(Unit spiritHealer) { return spiritHealer.GetGUID() == _areaSpiritHealerGUID; } public bool CanAcceptAreaSpiritHealFrom(Unit spiritHealer) { return spiritHealer.GetGUID() == _areaSpiritHealerGUID; }
public void SetAreaSpiritHealer(Creature creature) public void SetAreaSpiritHealer(Creature creature)
{ {
if (creature == null) if (creature == null)
@@ -4349,7 +4350,7 @@ namespace Game.Entities
areaSpiritHealerTime.TimeLeft = (uint)timeLeft; areaSpiritHealerTime.TimeLeft = (uint)timeLeft;
SendPacket(areaSpiritHealerTime); SendPacket(areaSpiritHealerTime);
} }
public void KillPlayer() public void KillPlayer()
{ {
if (IsFlying() && GetTransport() == null) if (IsFlying() && GetTransport() == null)
@@ -5254,7 +5255,7 @@ namespace Game.Entities
if (guildId != 0) if (guildId != 0)
{ {
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.GuildGUID), ObjectGuid.Create(HighGuid.Guild, guildId)); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.GuildGUID), ObjectGuid.Create(HighGuid.Guild, guildId));
SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.GuildClubMemberID), GetGUID().GetCounter()); SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_playerData.GuildClubMemberID), GetGUID().GetCounter());
SetPlayerFlag(PlayerFlags.GuildLevelEnabled); SetPlayerFlag(PlayerFlags.GuildLevelEnabled);
} }
else else
@@ -5376,6 +5377,8 @@ namespace Game.Entities
StartCriteria(CriteriaStartEvent.ReachLevel, level); StartCriteria(CriteriaStartEvent.ReachLevel, level);
UpdateCriteria(CriteriaType.ReachLevel); UpdateCriteria(CriteriaType.ReachLevel);
UpdateCriteria(CriteriaType.ActivelyReachLevel, level); UpdateCriteria(CriteriaType.ActivelyReachLevel, level);
if (level > oldLevel)
UpdateCriteria(CriteriaType.GainLevels, level - oldLevel);
PushQuests(); PushQuests();
@@ -7691,10 +7694,10 @@ namespace Game.Entities
public void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); } public void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); }
public void SetTransportServerTime(int transportServerTime) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TransportServerTime), transportServerTime); } public void SetTransportServerTime(int transportServerTime) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TransportServerTime), transportServerTime); }
public void SetRequiredMountCapabilityFlag(byte flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RequiredMountCapabilityFlags), flag); } public void SetRequiredMountCapabilityFlag(byte flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RequiredMountCapabilityFlags), flag); }
public void ReplaceAllRequiredMountCapabilityFlags(byte flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RequiredMountCapabilityFlags), flags); } public void ReplaceAllRequiredMountCapabilityFlags(byte flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RequiredMountCapabilityFlags), flags); }
public bool CanTameExoticPets() { return IsGameMaster() || HasAuraType(AuraType.AllowTamePetType); } public bool CanTameExoticPets() { return IsGameMaster() || HasAuraType(AuraType.AllowTamePetType); }
void SendAttackSwingCantAttack() { SendPacket(new AttackSwingError(AttackSwingErr.CantAttack)); } void SendAttackSwingCantAttack() { SendPacket(new AttackSwingError(AttackSwingErr.CantAttack)); }
@@ -7874,5 +7877,15 @@ namespace Game.Entities
//Clears the Menu //Clears the Menu
public void ClearGossipMenu() { PlayerTalkClass.ClearMenus(); } public void ClearGossipMenu() { PlayerTalkClass.ClearMenus(); }
public void SetPersonalTabard(int style, int color, int borderStyle, int borderColor, int backgroundColor)
{
CustomTabardInfo personalTabard = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PersonalTabard);
SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.EmblemStyle), style);
SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.EmblemColor), color);
SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.BorderStyle), borderStyle);
SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.BorderColor), borderColor);
SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.BackgroundColor), backgroundColor);
}
} }
} }
+8 -1
View File
@@ -566,7 +566,14 @@ namespace Game.Entities
public class DeclinedName public class DeclinedName
{ {
public StringArray name = new(SharedConst.MaxDeclinedNameCases); public StringArray name = new(SharedConst.MaxDeclinedNameCases);
}
public DeclinedName() { }
public DeclinedName(DeclinedNames uf)
{
for (var i = 0; i < SharedConst.MaxDeclinedNameCases; ++i)
name[i] = uf.Name[i];
}
}
struct PositionUpdateInfo struct PositionUpdateInfo
{ {
+3 -19
View File
@@ -1495,27 +1495,11 @@ namespace Game.Entities
} }
} }
uint modelid = 0;
SpellShapeshiftFormRecord formEntry = CliDB.SpellShapeshiftFormStorage.LookupByKey(form); SpellShapeshiftFormRecord formEntry = CliDB.SpellShapeshiftFormStorage.LookupByKey(form);
if (formEntry != null && formEntry.CreatureDisplayID[0] != 0) if (formEntry != null && formEntry.CreatureDisplayID != 0)
{ return formEntry.CreatureDisplayID;
// Take the alliance modelid as default
if (GetTypeId() != TypeId.Player)
return formEntry.CreatureDisplayID[0];
else
{
if (Player.TeamForRace(GetRace()) == Team.Alliance)
modelid = formEntry.CreatureDisplayID[0];
else
modelid = formEntry.CreatureDisplayID[1];
// If the player is horde but there are no values for the horde modelid - take the alliance modelid return 0;
if (modelid == 0 && Player.TeamForRace(GetRace()) == Team.Horde)
modelid = formEntry.CreatureDisplayID[0];
}
}
return modelid;
} }
public Totem ToTotem() { return IsTotem() ? (this as Totem) : null; } public Totem ToTotem() { return IsTotem() ? (this as Totem) : null; }
+8 -3
View File
@@ -3539,9 +3539,14 @@ namespace Game.Guilds
public bool ValidateEmblemColors() public bool ValidateEmblemColors()
{ {
return CliDB.GuildColorBackgroundStorage.ContainsKey(m_backgroundColor) && return ValidateEmblemColors(m_style, m_color, m_borderStyle, m_borderColor, m_backgroundColor);
CliDB.GuildColorBorderStorage.ContainsKey(m_borderColor) && }
CliDB.GuildColorEmblemStorage.ContainsKey(m_color);
public static bool ValidateEmblemColors(uint style, uint color, uint borderStyle, uint borderColor, uint backgroundColor)
{
return CliDB.GuildColorBackgroundStorage.ContainsKey(backgroundColor) &&
CliDB.GuildColorBorderStorage.ContainsKey(borderColor) &&
CliDB.GuildColorEmblemStorage.ContainsKey(color);
} }
public bool LoadFromDB(SQLFields field) public bool LoadFromDB(SQLFields field)
+10 -1
View File
@@ -607,8 +607,17 @@ namespace Game
{ {
// This packet is completely irrelevant, it triggers PVP_TYPES_ENABLED lua event but that is not handled in interface code as of 6.1.2 // This packet is completely irrelevant, it triggers PVP_TYPES_ENABLED lua event but that is not handled in interface code as of 6.1.2
PVPOptionsEnabled pvpOptionsEnabled = new(); PVPOptionsEnabled pvpOptionsEnabled = new();
pvpOptionsEnabled.RatedBattlegrounds = false;
pvpOptionsEnabled.PugBattlegrounds = true; pvpOptionsEnabled.PugBattlegrounds = true;
SendPacket(new PVPOptionsEnabled()); pvpOptionsEnabled.WargameBattlegrounds = false;
pvpOptionsEnabled.WargameArenas = false;
pvpOptionsEnabled.RatedArenas = false;
pvpOptionsEnabled.ArenaSkirmish = false;
pvpOptionsEnabled.SoloShuffle = false;
pvpOptionsEnabled.RatedSoloShuffle = false;
pvpOptionsEnabled.BattlegroundBlitz = false;
pvpOptionsEnabled.RatedBattlegroundBlitz = false;
SendPacket(pvpOptionsEnabled);
} }
[WorldPacketHandler(ClientOpcodes.RequestPvpRewards, Processing = PacketProcessing.Inplace)] [WorldPacketHandler(ClientOpcodes.RequestPvpRewards, Processing = PacketProcessing.Inplace)]
+3 -4
View File
@@ -26,8 +26,8 @@ namespace Game
CalendarSendCalendar packet = new(); CalendarSendCalendar packet = new();
packet.ServerTime = currTime; packet.ServerTime = currTime;
var invites = Global.CalendarMgr.GetPlayerInvites(guid); var playerInvites = Global.CalendarMgr.GetPlayerInvites(guid);
foreach (var invite in invites) foreach (var invite in playerInvites)
{ {
CalendarSendCalendarInviteInfo inviteInfo = new(); CalendarSendCalendarInviteInfo inviteInfo = new();
inviteInfo.EventID = invite.EventId; inviteInfo.EventID = invite.EventId;
@@ -45,7 +45,7 @@ namespace Game
var playerEvents = Global.CalendarMgr.GetPlayerEvents(guid); var playerEvents = Global.CalendarMgr.GetPlayerEvents(guid);
foreach (var calendarEvent in playerEvents) foreach (var calendarEvent in playerEvents)
{ {
CalendarSendCalendarEventInfo eventInfo; CalendarSendCalendarEventInfo eventInfo = new();
eventInfo.EventID = calendarEvent.EventId; eventInfo.EventID = calendarEvent.EventId;
eventInfo.Date = calendarEvent.Date; eventInfo.Date = calendarEvent.Date;
eventInfo.EventClubID = calendarEvent.GuildId; eventInfo.EventClubID = calendarEvent.GuildId;
@@ -61,7 +61,6 @@ namespace Game
foreach (InstanceLock instanceLock in Global.InstanceLockMgr.GetInstanceLocksForPlayer(_player.GetGUID())) foreach (InstanceLock instanceLock in Global.InstanceLockMgr.GetInstanceLocksForPlayer(_player.GetGUID()))
{ {
CalendarSendCalendarRaidLockoutInfo lockoutInfo = new(); CalendarSendCalendarRaidLockoutInfo lockoutInfo = new();
lockoutInfo.MapID = (int)instanceLock.GetMapId(); lockoutInfo.MapID = (int)instanceLock.GetMapId();
lockoutInfo.DifficultyID = (uint)instanceLock.GetDifficultyId(); lockoutInfo.DifficultyID = (uint)instanceLock.GetDifficultyId();
lockoutInfo.ExpireTime = (int)Math.Max((instanceLock.GetEffectiveExpiryTime() - GameTime.GetSystemTime()).TotalSeconds, 0); lockoutInfo.ExpireTime = (int)Math.Max((instanceLock.GetEffectiveExpiryTime() - GameTime.GetSystemTime()).TotalSeconds, 0);
+25 -5
View File
@@ -111,8 +111,6 @@ namespace Game
while (result.NextRow() && charResult.Characters.Count < 200); while (result.NextRow() && charResult.Characters.Count < 200);
} }
charResult.IsAlliedRacesCreationAllowed = CanAccessAlliedRaces();
foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements())
{ {
EnumCharactersResult.RaceUnlock raceUnlock = new(); EnumCharactersResult.RaceUnlock raceUnlock = new();
@@ -811,9 +809,8 @@ namespace Game
SendFeatureSystemStatus(); SendFeatureSystemStatus();
MOTD motd = new(); foreach (var motdLine in Global.WorldMgr.GetMotd())
motd.Text = Global.WorldMgr.GetMotd(); Global.WorldMgr.SendServerMessage(ServerMessageType.String, motdLine, pCurrChar);
SendPacket(motd);
SendSetTimeZoneInformation(); SendSetTimeZoneInformation();
@@ -2544,6 +2541,29 @@ namespace Game
GetPlayer().SetStandState(packet.StandState); GetPlayer().SetStandState(packet.StandState);
} }
[WorldPacketHandler(ClientOpcodes.SavePersonalEmblem)]
void HandleSavePersonalEmblem(SavePersonalEmblem savePersonalEmblem)
{
if (_player.GetNPCIfCanInteractWith(savePersonalEmblem.Vendor, NPCFlags.None, NPCFlags2.PersonalTabardDesigner) == null)
{
SendPacket(new PlayerSavePersonalEmblem(GuildEmblemError.InvalidVendor));
return;
}
if (!Guild.EmblemInfo.ValidateEmblemColors((uint)savePersonalEmblem.PersonalTabard.EmblemStyle, (uint)savePersonalEmblem.PersonalTabard.EmblemColor,
(uint)savePersonalEmblem.PersonalTabard.BorderStyle, (uint)savePersonalEmblem.PersonalTabard.BorderColor, (uint)savePersonalEmblem.PersonalTabard.BackgroundColor))
{
SendPacket(new PlayerSavePersonalEmblem(GuildEmblemError.InvalidTabardColors));
return;
}
_player.SetPersonalTabard(savePersonalEmblem.PersonalTabard.EmblemStyle, savePersonalEmblem.PersonalTabard.EmblemColor,
savePersonalEmblem.PersonalTabard.BorderStyle, savePersonalEmblem.PersonalTabard.BorderColor,
savePersonalEmblem.PersonalTabard.BackgroundColor);
SendPacket(new PlayerSavePersonalEmblem(GuildEmblemError.Success));
}
void SendCharCreate(ResponseCodes result, ObjectGuid guid = default) void SendCharCreate(ResponseCodes result, ObjectGuid guid = default)
{ {
CreateChar response = new(); CreateChar response = new();
+24 -7
View File
@@ -17,27 +17,44 @@ namespace Game
public partial class WorldSession public partial class WorldSession
{ {
[WorldPacketHandler(ClientOpcodes.TabardVendorActivate, Processing = PacketProcessing.Inplace)] [WorldPacketHandler(ClientOpcodes.TabardVendorActivate, Processing = PacketProcessing.Inplace)]
void HandleTabardVendorActivate(Hello packet) void HandleTabardVendorActivate(TabardVendorActivate tabardVendorActivate)
{ {
Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.TabardDesigner, NPCFlags2.None); Creature unit = GetPlayer().GetNPCIfCanInteractWith(tabardVendorActivate.Vendor, NPCFlags.TabardDesigner, NPCFlags2.None);
if (unit == null) if (unit == null)
{ {
Log.outDebug(LogFilter.Network, "WORLD: HandleTabardVendorActivateOpcode - {0} not found or you can not interact with him.", packet.Unit.ToString()); Log.outDebug(LogFilter.Network, $"WORLD: HandleTabardVendorActivateOpcode - {tabardVendorActivate.Vendor} not found or you can not interact with him.");
return; return;
} }
TabardVendorType type = (TabardVendorType)tabardVendorActivate.Type;
if (type != TabardVendorType.Guild && type != TabardVendorType.Personal)
return;
// remove fake death // remove fake death
if (GetPlayer().HasUnitState(UnitState.Died)) if (GetPlayer().HasUnitState(UnitState.Died))
GetPlayer().RemoveAurasByType(AuraType.FeignDeath); GetPlayer().RemoveAurasByType(AuraType.FeignDeath);
SendTabardVendorActivate(packet.Unit); SendTabardVendorActivate(tabardVendorActivate.Vendor, type);
} }
public void SendTabardVendorActivate(ObjectGuid guid) public void SendTabardVendorActivate(ObjectGuid guid, TabardVendorType type)
{ {
NPCInteractionOpenResult npcInteraction = new(); NPCInteractionOpenResult npcInteraction = new();
npcInteraction.Npc = guid; npcInteraction.Npc = guid;
npcInteraction.InteractionType = PlayerInteractionType.TabardVendor;
switch (type)
{
case TabardVendorType.Guild:
npcInteraction.InteractionType = PlayerInteractionType.GuildTabardVendor;
break;
case TabardVendorType.Personal:
npcInteraction.InteractionType = PlayerInteractionType.PersonalTabardVendor;
break;
default:
Log.outFatal(LogFilter.Server, $"Unsupported tabard vendor type {type}");
break;
}
npcInteraction.Success = true; npcInteraction.Success = true;
SendPacket(npcInteraction); SendPacket(npcInteraction);
} }
@@ -345,7 +362,7 @@ namespace Game
_player.SetPetSlot(setPetSlot.PetNumber, (PetSaveMode)setPetSlot.DestSlot); _player.SetPetSlot(setPetSlot.PetNumber, (PetSaveMode)setPetSlot.DestSlot);
} }
[WorldPacketHandler(ClientOpcodes.RepairItem, Processing = PacketProcessing.Inplace)] [WorldPacketHandler(ClientOpcodes.RepairItem, Processing = PacketProcessing.Inplace)]
void HandleRepairItem(RepairItem packet) void HandleRepairItem(RepairItem packet)
{ {
@@ -310,15 +310,23 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(WargameArenas); _worldPacket.WriteBit(WargameArenas);
_worldPacket.WriteBit(RatedArenas); _worldPacket.WriteBit(RatedArenas);
_worldPacket.WriteBit(ArenaSkirmish); _worldPacket.WriteBit(ArenaSkirmish);
_worldPacket.WriteBit(SoloShuffle);
_worldPacket.WriteBit(RatedSoloShuffle);
_worldPacket.WriteBit(BattlegroundBlitz);
_worldPacket.WriteBit(RatedBattlegroundBlitz);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
public bool RatedBattlegrounds;
public bool PugBattlegrounds;
public bool WargameBattlegrounds;
public bool WargameArenas; public bool WargameArenas;
public bool RatedArenas; public bool RatedArenas;
public bool WargameBattlegrounds;
public bool ArenaSkirmish; public bool ArenaSkirmish;
public bool PugBattlegrounds; public bool SoloShuffle;
public bool RatedBattlegrounds; public bool RatedSoloShuffle;
public bool BattlegroundBlitz;
public bool RatedBattlegroundBlitz; // solo rbg
} }
class RequestBattlefieldStatus : ClientPacket class RequestBattlefieldStatus : ClientPacket
@@ -510,7 +518,7 @@ namespace Game.Networking.Packets
PVPMatchState State; PVPMatchState State;
} }
class PVPMatchComplete : ServerPacket class PVPMatchComplete : ServerPacket
{ {
public PVPMatchComplete() : base(ServerOpcodes.PvpMatchComplete, ConnectionType.Instance) { } public PVPMatchComplete() : base(ServerOpcodes.PvpMatchComplete, ConnectionType.Instance) { }
@@ -149,12 +149,12 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(Events.Count); _worldPacket.WriteInt32(Events.Count);
_worldPacket.WriteInt32(RaidLockouts.Count); _worldPacket.WriteInt32(RaidLockouts.Count);
foreach (var invite in Invites)
invite.Write(_worldPacket);
foreach (var lockout in RaidLockouts) foreach (var lockout in RaidLockouts)
lockout.Write(_worldPacket); lockout.Write(_worldPacket);
foreach (var invite in Invites)
invite.Write(_worldPacket);
foreach (var Event in Events) foreach (var Event in Events)
Event.Write(_worldPacket); Event.Write(_worldPacket);
} }
@@ -822,6 +822,8 @@ namespace Game.Networking.Packets
data.WriteUInt8((byte)Moderator); data.WriteUInt8((byte)Moderator);
data.WriteUInt8(InviteType); data.WriteUInt8(InviteType);
data.WritePackedGuid(InviterGuid); data.WritePackedGuid(InviterGuid);
data.WriteBit(IgnoreFriendAndGuildRestriction);
data.FlushBits();
} }
public ulong EventID; public ulong EventID;
@@ -830,6 +832,7 @@ namespace Game.Networking.Packets
public CalendarInviteStatus Status; public CalendarInviteStatus Status;
public CalendarModerationRank Moderator; public CalendarModerationRank Moderator;
public byte InviteType; public byte InviteType;
public bool IgnoreFriendAndGuildRestriction;
} }
struct CalendarSendCalendarRaidLockoutInfo struct CalendarSendCalendarRaidLockoutInfo
{ {
@@ -33,7 +33,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(IsNewPlayer); _worldPacket.WriteBit(IsNewPlayer);
_worldPacket.WriteBit(IsTrialAccountRestricted); _worldPacket.WriteBit(IsTrialAccountRestricted);
_worldPacket.WriteBit(DisabledClassesMask.HasValue); _worldPacket.WriteBit(DisabledClassesMask.HasValue);
_worldPacket.WriteBit(IsAlliedRacesCreationAllowed);
_worldPacket.WriteInt32(Characters.Count); _worldPacket.WriteInt32(Characters.Count);
_worldPacket.WriteInt32(MaxCharacterLevel); _worldPacket.WriteInt32(MaxCharacterLevel);
_worldPacket.WriteInt32(RaceUnlockData.Count); _worldPacket.WriteInt32(RaceUnlockData.Count);
@@ -62,7 +61,6 @@ namespace Game.Networking.Packets
public bool IsNewPlayerRestricted; // forbids using level boost and class trials public bool IsNewPlayerRestricted; // forbids using level boost and class trials
public bool IsNewPlayer; // forbids hero classes and allied races public bool IsNewPlayer; // forbids hero classes and allied races
public bool IsTrialAccountRestricted; public bool IsTrialAccountRestricted;
public bool IsAlliedRacesCreationAllowed;
public int MaxCharacterLevel = 1; public int MaxCharacterLevel = 1;
public uint? DisabledClassesMask = new(); public uint? DisabledClassesMask = new();
@@ -105,7 +103,7 @@ namespace Game.Networking.Packets
if (fields.Read<uint>(18) != 0) if (fields.Read<uint>(18) != 0)
Flags |= CharacterFlags.LockedByBilling; Flags |= CharacterFlags.LockedByBilling;
if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read<string>(23))) if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read<string>(28)))
Flags |= CharacterFlags.Declined; Flags |= CharacterFlags.Declined;
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize)) if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize))
@@ -145,6 +143,12 @@ namespace Game.Networking.Packets
LastLoginVersion = fields.Read<int>(22); LastLoginVersion = fields.Read<int>(22);
PersonalTabard.EmblemStyle = fields.Read<int>(23);
PersonalTabard.EmblemColor = fields.Read<int>(24);
PersonalTabard.BorderStyle = fields.Read<int>(25);
PersonalTabard.BorderColor = fields.Read<int>(26);
PersonalTabard.BackgroundColor = fields.Read<int>(27);
int equipmentFieldsPerSlot = 5; int equipmentFieldsPerSlot = 5;
for (var slot = 0; slot < VisualItems.Length && (slot + 1) * equipmentFieldsPerSlot <= equipment.Length; ++slot) for (var slot = 0; slot < VisualItems.Length && (slot + 1) * equipmentFieldsPerSlot <= equipment.Length; ++slot)
@@ -194,6 +198,7 @@ namespace Game.Networking.Packets
data.WriteInt32(MailSenders.Count); data.WriteInt32(MailSenders.Count);
data.WriteInt32(MailSenderTypes.Count); data.WriteInt32(MailSenderTypes.Count);
data.WriteUInt32(OverrideSelectScreenFileDataID); data.WriteUInt32(OverrideSelectScreenFileDataID);
PersonalTabard.Write(data);
foreach (ChrCustomizationChoice customization in Customizations) foreach (ChrCustomizationChoice customization in Customizations)
{ {
@@ -208,6 +213,8 @@ namespace Game.Networking.Packets
data.WriteBit(FirstLogin); data.WriteBit(FirstLogin);
data.WriteBit(BoostInProgress); data.WriteBit(BoostInProgress);
data.WriteBits(unkWod61x, 5); data.WriteBits(unkWod61x, 5);
data.WriteBit(RpeResetAvailable);
data.WriteBit(RpeResetQuestClearAvailable);
foreach (string str in MailSenders) foreach (string str in MailSenders)
data.WriteBits(str.GetByteCount() + 1, 6); data.WriteBits(str.GetByteCount() + 1, 6);
@@ -228,7 +235,7 @@ namespace Game.Networking.Packets
public byte RaceId; public byte RaceId;
public Class ClassId; public Class ClassId;
public byte SexId; public byte SexId;
public Array<ChrCustomizationChoice> Customizations = new(125); public Array<ChrCustomizationChoice> Customizations = new(250);
public byte ExperienceLevel; public byte ExperienceLevel;
public uint ZoneId; public uint ZoneId;
public uint MapId; public uint MapId;
@@ -253,6 +260,9 @@ namespace Game.Networking.Packets
public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.ReagentBagEnd]; public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.ReagentBagEnd];
public List<string> MailSenders = new(); public List<string> MailSenders = new();
public List<uint> MailSenderTypes = new(); public List<uint> MailSenderTypes = new();
public bool RpeResetAvailable = false;
public bool RpeResetQuestClearAvailable = false;
public CustomTabardInfo PersonalTabard = new();
public struct VisualItemInfo public struct VisualItemInfo
{ {
@@ -288,6 +298,7 @@ namespace Game.Networking.Packets
data.WriteBit(HasExpansion); data.WriteBit(HasExpansion);
data.WriteBit(HasAchievement); data.WriteBit(HasAchievement);
data.WriteBit(HasHeritageArmor); data.WriteBit(HasHeritageArmor);
data.WriteBit(IsLocked);
data.FlushBits(); data.FlushBits();
} }
@@ -295,6 +306,7 @@ namespace Game.Networking.Packets
public bool HasExpansion; public bool HasExpansion;
public bool HasAchievement; public bool HasAchievement;
public bool HasHeritageArmor; public bool HasHeritageArmor;
public bool IsLocked;
} }
public struct UnlockedConditionalAppearance public struct UnlockedConditionalAppearance
@@ -329,7 +341,7 @@ namespace Game.Networking.Packets
} }
class CheckCharacterNameAvailability : ClientPacket class CheckCharacterNameAvailability : ClientPacket
{ {
public uint SequenceIndex; public uint SequenceIndex;
public string Name; public string Name;
@@ -359,7 +371,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteUInt32((uint)Result);
} }
} }
public class CreateCharacter : ClientPacket public class CreateCharacter : ClientPacket
{ {
public CreateCharacter(WorldPacket packet) : base(packet) { } public CreateCharacter(WorldPacket packet) : base(packet) { }
@@ -570,7 +582,7 @@ namespace Game.Networking.Packets
public string Name; public string Name;
public byte SexID; public byte SexID;
public byte RaceID; public byte RaceID;
public Array<ChrCustomizationChoice> Customizations = new(125); public Array<ChrCustomizationChoice> Customizations = new(250);
} }
} }
@@ -883,7 +895,7 @@ namespace Game.Networking.Packets
} }
public byte NewSex; public byte NewSex;
public Array<ChrCustomizationChoice> Customizations = new(125); public Array<ChrCustomizationChoice> Customizations = new(250);
public int CustomizedRace; public int CustomizedRace;
public int CustomizedChrModelID; public int CustomizedChrModelID;
} }
@@ -952,7 +964,7 @@ namespace Game.Networking.Packets
FactionIndex = _worldPacket.ReadUInt8(); FactionIndex = _worldPacket.ReadUInt8();
} }
public byte FactionIndex; public ushort FactionIndex;
} }
class SetFactionNotAtWar : ClientPacket class SetFactionNotAtWar : ClientPacket
@@ -964,7 +976,7 @@ namespace Game.Networking.Packets
FactionIndex = _worldPacket.ReadUInt8(); FactionIndex = _worldPacket.ReadUInt8();
} }
public byte FactionIndex; public ushort FactionIndex;
} }
class SetFactionInactive : ClientPacket class SetFactionInactive : ClientPacket
@@ -1089,6 +1101,35 @@ namespace Game.Networking.Packets
public DeclinedNameResult ResultCode; public DeclinedNameResult ResultCode;
} }
class SavePersonalEmblem : ClientPacket
{
public ObjectGuid Vendor;
public CustomTabardInfo PersonalTabard = new();
public SavePersonalEmblem(WorldPacket packet) : base(packet) { }
public override void Read()
{
Vendor = _worldPacket.ReadPackedGuid();
PersonalTabard.Read(_worldPacket);
}
}
class PlayerSavePersonalEmblem : ServerPacket
{
public GuildEmblemError Error;
public PlayerSavePersonalEmblem(GuildEmblemError error) : base(ServerOpcodes.PlayerSavePersonalEmblem)
{
Error = error;
}
public override void Write()
{
_worldPacket.WriteInt32((int)Error);
}
}
//Structs //Structs
public class CharacterCreateInfo public class CharacterCreateInfo
{ {
@@ -1096,7 +1137,7 @@ namespace Game.Networking.Packets
public Race RaceId = Race.None; public Race RaceId = Race.None;
public Class ClassId = Class.None; public Class ClassId = Class.None;
public Gender Sex = Gender.None; public Gender Sex = Gender.None;
public Array<ChrCustomizationChoice> Customizations = new(125); public Array<ChrCustomizationChoice> Customizations = new(250);
public uint? TemplateSet; public uint? TemplateSet;
public bool IsTrialBoost; public bool IsTrialBoost;
public bool UseNPE; public bool UseNPE;
@@ -1117,7 +1158,7 @@ namespace Game.Networking.Packets
public ObjectGuid CharGUID; public ObjectGuid CharGUID;
public Gender SexID = Gender.None; public Gender SexID = Gender.None;
public string CharName; public string CharName;
public Array<ChrCustomizationChoice> Customizations = new(125); public Array<ChrCustomizationChoice> Customizations = new(250);
} }
public class CharRaceOrFactionChangeInfo public class CharRaceOrFactionChangeInfo
@@ -1128,15 +1169,42 @@ namespace Game.Networking.Packets
public ObjectGuid Guid; public ObjectGuid Guid;
public bool FactionChange; public bool FactionChange;
public string Name; public string Name;
public Array<ChrCustomizationChoice> Customizations = new(125); public Array<ChrCustomizationChoice> Customizations = new(250);
} }
public class CharacterUndeleteInfo public class CharacterUndeleteInfo
{ // User specified variables { // User specified variables
public ObjectGuid CharacterGuid; // Guid of the character to restore public ObjectGuid CharacterGuid; // Guid of the character to restore
public int ClientToken = 0; // @todo: research public int ClientToken; // @todo: research
// Server side data // Server side data
public string Name; public string Name;
} }
public class CustomTabardInfo
{
public int EmblemStyle = -1;
public int EmblemColor = -1;
public int BorderStyle = -1;
public int BorderColor = -1;
public int BackgroundColor = -1;
public void Write(WorldPacket data)
{
data.WriteInt32(EmblemStyle);
data.WriteInt32(EmblemColor);
data.WriteInt32(BorderStyle);
data.WriteInt32(BorderColor);
data.WriteInt32(BackgroundColor);
}
public void Read(WorldPacket data)
{
EmblemStyle = data.ReadInt32();
EmblemColor = data.ReadInt32();
BorderStyle = data.ReadInt32();
BorderColor = data.ReadInt32();
BackgroundColor = data.ReadInt32();
}
}
} }
@@ -108,6 +108,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(FirstCraftOperationID.HasValue); _worldPacket.WriteBit(FirstCraftOperationID.HasValue);
_worldPacket.WriteBit(NextRechargeTime.HasValue); _worldPacket.WriteBit(NextRechargeTime.HasValue);
_worldPacket.WriteBit(RechargeCycleStartTime.HasValue); _worldPacket.WriteBit(RechargeCycleStartTime.HasValue);
_worldPacket.WriteBit(OverflownCurrencyID.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
if (WeeklyQuantity.HasValue) if (WeeklyQuantity.HasValue)
@@ -139,6 +140,9 @@ namespace Game.Networking.Packets
if (RechargeCycleStartTime.HasValue) if (RechargeCycleStartTime.HasValue)
_worldPacket.WriteInt64(RechargeCycleStartTime.Value); _worldPacket.WriteInt64(RechargeCycleStartTime.Value);
if (OverflownCurrencyID.HasValue)
_worldPacket.WriteInt32(OverflownCurrencyID.Value);
} }
public uint Type; public uint Type;
@@ -155,6 +159,7 @@ namespace Game.Networking.Packets
public uint? FirstCraftOperationID; public uint? FirstCraftOperationID;
public long? NextRechargeTime; public long? NextRechargeTime;
public long? RechargeCycleStartTime; public long? RechargeCycleStartTime;
public int? OverflownCurrencyID; // what currency was originally changed but couldn't be incremented because of a cap
public bool SuppressChatLog; public bool SuppressChatLog;
} }
@@ -1442,17 +1447,17 @@ namespace Game.Networking.Packets
{ {
public PhaseShiftDataPhase(uint phaseFlags, uint id) public PhaseShiftDataPhase(uint phaseFlags, uint id)
{ {
PhaseFlags = (ushort)phaseFlags; PhaseFlags = phaseFlags;
Id = (ushort)id; Id = (ushort)id;
} }
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt16(PhaseFlags); data.WriteUInt32(PhaseFlags);
data.WriteUInt16(Id); data.WriteUInt16(Id);
} }
public ushort PhaseFlags; public uint PhaseFlags;
public ushort Id; public ushort Id;
} }
@@ -1497,7 +1497,6 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt32(Id); data.WriteUInt32(Id);
data.WriteVector3(Destination);
data.WriteBit(CrzTeleport); data.WriteBit(CrzTeleport);
data.WriteBits(StopDistanceTolerance, 3); data.WriteBits(StopDistanceTolerance, 3);
@@ -1505,7 +1504,6 @@ namespace Game.Networking.Packets
} }
public uint Id; public uint Id;
public Vector3 Destination;
public bool CrzTeleport; public bool CrzTeleport;
public byte StopDistanceTolerance; // Determines how far from spline destination the mover is allowed to stop in place 0, 0, 3.0, 2.76, numeric_limits<float>::max, 1.1, float(INT_MAX); default before this field existed was distance 3.0 (index 2) public byte StopDistanceTolerance; // Determines how far from spline destination the mover is allowed to stop in place 0, 0, 3.0, 2.76, numeric_limits<float>::max, 1.1, float(INT_MAX); default before this field existed was distance 3.0 (index 2)
public MovementSpline Move; public MovementSpline Move;
+19 -5
View File
@@ -45,7 +45,7 @@ namespace Game.Networking.Packets
public PlayerInteractionType InteractionType; public PlayerInteractionType InteractionType;
public bool Success = true; public bool Success = true;
} }
public class GossipMessagePkt : ServerPacket public class GossipMessagePkt : ServerPacket
{ {
public GossipMessagePkt() : base(ServerOpcodes.GossipMessage) { } public GossipMessagePkt() : base(ServerOpcodes.GossipMessage) { }
@@ -122,7 +122,7 @@ namespace Game.Networking.Packets
public int GossipNpcOptionID; public int GossipNpcOptionID;
public int? FriendshipFactionID; public int? FriendshipFactionID;
} }
public class GossipComplete : ServerPacket public class GossipComplete : ServerPacket
{ {
public bool SuppressSound; public bool SuppressSound;
@@ -230,6 +230,20 @@ namespace Game.Networking.Packets
public ObjectGuid Healer; public ObjectGuid Healer;
} }
class TabardVendorActivate : ClientPacket
{
public ObjectGuid Vendor;
public int Type;
public TabardVendorActivate(WorldPacket packet) : base(packet) { }
public override void Read()
{
Vendor = _worldPacket.ReadPackedGuid();
Type = _worldPacket.ReadInt32();
}
}
class TrainerBuySpell : ClientPacket class TrainerBuySpell : ClientPacket
{ {
public TrainerBuySpell(WorldPacket packet) : base(packet) { } public TrainerBuySpell(WorldPacket packet) : base(packet) { }
@@ -238,7 +252,7 @@ namespace Game.Networking.Packets
{ {
TrainerGUID = _worldPacket.ReadPackedGuid(); TrainerGUID = _worldPacket.ReadPackedGuid();
TrainerID = _worldPacket.ReadUInt32(); TrainerID = _worldPacket.ReadUInt32();
SpellID= _worldPacket.ReadUInt32(); SpellID = _worldPacket.ReadUInt32();
} }
public ObjectGuid TrainerGUID; public ObjectGuid TrainerGUID;
@@ -289,7 +303,7 @@ namespace Game.Networking.Packets
public uint PetNumber; public uint PetNumber;
public byte DestSlot; public byte DestSlot;
} }
//Structs //Structs
public struct TreasureItem public struct TreasureItem
{ {
@@ -406,7 +420,7 @@ namespace Game.Networking.Packets
data.WriteBit(DoNotFilterOnVendor); data.WriteBit(DoNotFilterOnVendor);
data.WriteBit(Refundable); data.WriteBit(Refundable);
data.FlushBits(); data.FlushBits();
Item.Write(data); Item.Write(data);
} }
@@ -1042,17 +1042,17 @@ namespace Game.Networking.Packets
{ {
public PartyMemberPhase(uint flags, uint id) public PartyMemberPhase(uint flags, uint id)
{ {
Flags = (ushort)flags; Flags = flags;
Id = (ushort)id; Id = (ushort)id;
} }
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt16(Flags); data.WriteUInt32(Flags);
data.WriteUInt16(Id); data.WriteUInt16(Id);
} }
public ushort Flags; public uint Flags;
public ushort Id; public ushort Id;
} }
@@ -601,9 +601,9 @@ namespace Game.Networking.Packets
ClassID = player.GetClass(); ClassID = player.GetClass();
Level = (byte)player.GetLevel(); Level = (byte)player.GetLevel();
DeclinedName names = player.GetDeclinedNames(); DeclinedNames names = player.GetDeclinedNames();
if (names != null) if (names != null)
DeclinedNames = names; DeclinedNames = new(names);
} }
else else
{ {
@@ -8,7 +8,7 @@ namespace Game.Networking.Packets
{ {
public class InitializeFactions : ServerPacket public class InitializeFactions : ServerPacket
{ {
const ushort FactionCount = 443; const ushort FactionCount = 1000;
public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { } public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { }
@@ -93,7 +93,7 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
uint nameLength = _worldPacket.ReadBits<uint>(9); uint nameLength = _worldPacket.ReadBits<uint>(9);
uint noteslength = _worldPacket.ReadBits<uint>(10); uint noteslength = _worldPacket.ReadBits<uint>(9);
Name = _worldPacket.ReadString(nameLength); Name = _worldPacket.ReadString(nameLength);
Notes = _worldPacket.ReadString(noteslength); Notes = _worldPacket.ReadString(noteslength);
} }
+10 -22
View File
@@ -83,9 +83,13 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(ChatDisabledByPlayer); _worldPacket.WriteBit(ChatDisabledByPlayer);
_worldPacket.WriteBit(LFGListCustomRequiresAuthenticator); _worldPacket.WriteBit(LFGListCustomRequiresAuthenticator);
_worldPacket.WriteBit(AddonsDisabled); _worldPacket.WriteBit(AddonsDisabled);
_worldPacket.WriteBit(Unused1000); _worldPacket.WriteBit(WarGamesEnabled);
_worldPacket.WriteBit(ContentTrackingEnabled); _worldPacket.WriteBit(ContentTrackingEnabled);
_worldPacket.WriteBit(IsSellAllJunkEnabled); _worldPacket.WriteBit(IsSellAllJunkEnabled);
_worldPacket.WriteBit(IsGroupFinderEnabled);
_worldPacket.WriteBit(IsLFDEnabled);
_worldPacket.WriteBit(IsLFREnabled);
_worldPacket.WriteBit(IsPremadeGroupEnabled);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -177,9 +181,13 @@ namespace Game.Networking.Packets
public bool ChatDisabledByPlayer; public bool ChatDisabledByPlayer;
public bool LFGListCustomRequiresAuthenticator; public bool LFGListCustomRequiresAuthenticator;
public bool AddonsDisabled; public bool AddonsDisabled;
public bool Unused1000; public bool WarGamesEnabled; // classic only
public bool ContentTrackingEnabled; public bool ContentTrackingEnabled;
public bool IsSellAllJunkEnabled; public bool IsSellAllJunkEnabled;
public bool IsGroupFinderEnabled = true; // classic only
public bool IsLFDEnabled = true; // classic only
public bool IsLFREnabled = true; // classic only
public bool IsPremadeGroupEnabled = true; // classic only
public SocialQueueConfig QuickJoinConfig; public SocialQueueConfig QuickJoinConfig;
public SquelchInfo Squelch; public SquelchInfo Squelch;
@@ -361,26 +369,6 @@ namespace Game.Networking.Packets
public string RealmHiddenAlert; public string RealmHiddenAlert;
} }
public class MOTD : ServerPacket
{
public MOTD() : base(ServerOpcodes.Motd) { }
public override void Write()
{
_worldPacket.WriteBits(Text.Count, 4);
_worldPacket.FlushBits();
foreach (var line in Text)
{
_worldPacket.WriteBits(line.GetByteCount(), 7);
_worldPacket.FlushBits();
_worldPacket.WriteString(line);
}
}
public List<string> Text;
}
public class SetTimeZoneInformation : ServerPacket public class SetTimeZoneInformation : ServerPacket
{ {
public SetTimeZoneInformation() : base(ServerOpcodes.SetTimeZoneInformation) { } public SetTimeZoneInformation() : base(ServerOpcodes.SetTimeZoneInformation) { }
@@ -42,9 +42,11 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
uint areasCount = _worldPacket.ReadBits<uint>(4); uint areasCount = _worldPacket.ReadBits<uint>(4);
IsFromAddOn = _worldPacket.HasBit();
Request.Read(_worldPacket); Request.Read(_worldPacket);
RequestID = _worldPacket.ReadUInt32(); RequestID = _worldPacket.ReadUInt32();
Origin = _worldPacket.ReadUInt8();
for (int i = 0; i < areasCount; ++i) for (int i = 0; i < areasCount; ++i)
Areas.Add(_worldPacket.ReadInt32()); Areas.Add(_worldPacket.ReadInt32());
@@ -52,6 +54,8 @@ namespace Game.Networking.Packets
public WhoRequest Request = new(); public WhoRequest Request = new();
public uint RequestID; public uint RequestID;
public byte Origin; // 1 = Social, 2 = Chat, 3 = Item
public bool IsFromAddOn;
public List<int> Areas= new(); public List<int> Areas= new();
} }
+5 -1
View File
@@ -1899,9 +1899,13 @@ namespace Game
public void SendServerMessage(ServerMessageType messageID, string stringParam = "", Player player = null) public void SendServerMessage(ServerMessageType messageID, string stringParam = "", Player player = null)
{ {
ServerMessagesRecord serverMessage = CliDB.ServerMessagesStorage.LookupByKey(messageID);
if (serverMessage == null)
return;
ChatServerMessage packet = new(); ChatServerMessage packet = new();
packet.MessageID = (int)messageID; packet.MessageID = (int)messageID;
if (messageID <= ServerMessageType.String) if (serverMessage.Text[player != null ? player.GetSession().GetSessionDbcLocale() : GetDefaultDbcLocale()].Contains("%s"))
packet.StringParam = stringParam; packet.StringParam = stringParam;
if (player != null) if (player != null)