From 0b6d4eaf8e57d76f16d9232017a84298d51f4dd8 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 12 Feb 2026 20:49:32 +0100 Subject: [PATCH] Core: Updated to 12.0.1 --- sql/base/auth_database.sql | 35 ++++- .../auth/master/2026_02_12_00_auth.sql | 39 ++++++ .../master/2026_02_12_00_hotfixes.sql | 29 +++++ .../Implementation/HotfixDatabase.cpp | 5 +- .../Database/Implementation/HotfixDatabase.h | 1 + src/server/game/DataStores/DB2LoadInfo.h | 12 +- src/server/game/DataStores/DB2Metadata.h | 51 ++++---- src/server/game/DataStores/DB2Structure.h | 8 +- .../Entities/Object/Updates/UpdateFieldImpl.h | 2 +- .../Entities/Object/Updates/UpdateFields.cpp | 57 +++++--- .../Entities/Object/Updates/UpdateFields.h | 24 ++-- src/server/game/Entities/Player/Player.cpp | 2 + src/server/game/Entities/Unit/Unit.cpp | 8 +- src/server/game/Entities/Unit/Unit.h | 1 + src/server/game/Miscellaneous/SharedDefines.h | 122 ++++++++--------- .../game/Server/Packets/CombatLogPackets.cpp | 68 +++++----- .../game/Server/Packets/CombatLogPackets.h | 39 +++--- .../Server/Packets/CombatLogPacketsCommon.cpp | 15 ++- .../Server/Packets/CombatLogPacketsCommon.h | 5 +- .../game/Server/Packets/SystemPackets.h | 1 - src/server/game/Server/Protocol/Opcodes.cpp | 5 + src/server/game/Server/Protocol/Opcodes.h | 123 +++++++++--------- .../game/Spells/Auras/SpellAuraDefines.h | 2 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 2 +- src/server/game/Spells/Spell.cpp | 4 + src/server/game/Spells/Spell.h | 3 +- 26 files changed, 419 insertions(+), 244 deletions(-) create mode 100644 sql/updates/auth/master/2026_02_12_00_auth.sql create mode 100644 sql/updates/hotfixes/master/2026_02_12_00_hotfixes.sql diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 0f6509e4ef..9a0f928e59 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1404,7 +1404,28 @@ INSERT INTO `build_auth_key` VALUES (65727,'Mac','x64','WoWC',0x6B0B37F8F3D87736FA9C82009ACD0CFB), (65727,'Win','A64','WoW',0xEFAB5EAAC583CBF8D5B1F78E3FEB7004), (65727,'Win','x64','WoW',0xC2D8FE2AB89A557A0700B53B04B2E152), -(65727,'Win','x64','WoWC',0xC25BCE27CE4DC62302FAC67BB2ABCF2A); +(65727,'Win','x64','WoWC',0xC25BCE27CE4DC62302FAC67BB2ABCF2A), +(65818,'Mac','A64','WoW',0xF5F5FDB55355B846D75F9DD662859DE6), +(65818,'Mac','A64','WoWC',0x7C22D043962282E5AE79F4727FDD08A7), +(65818,'Mac','x64','WoW',0xC9F254309AB02D4DE2C69F406CAADD6D), +(65818,'Mac','x64','WoWC',0xD14FA35344953D9B576C776BC6D224A5), +(65818,'Win','A64','WoW',0xD934E6F9FC8ABBBE081EF1CBABB94DE6), +(65818,'Win','x64','WoW',0xF95DA20B62A41FD45A4222AD20806CD6), +(65818,'Win','x64','WoWC',0x31047A65186E5C9D17B73A4D38461705), +(65848,'Mac','A64','WoW',0x6045CAD5A5E2C05BAF489A0C29B589DD), +(65848,'Mac','A64','WoWC',0x219D0EE672094F2ED9B6E9494BE34EED), +(65848,'Mac','x64','WoW',0x39D1A9118ED8CEDE3534613A0558AB44), +(65848,'Mac','x64','WoWC',0x5EE49CAAA70BB66A83C2D51E881C1819), +(65848,'Win','A64','WoW',0x74BF726BEB5BA22E855F0DC6AB72B22C), +(65848,'Win','x64','WoW',0xFC91D5EB0678A0A537E68E68F92E390D), +(65848,'Win','x64','WoWC',0x263884BA5E5536FD5012596F10BDC132), +(65867,'Mac','A64','WoW',0x09FA621C9C012A9A2A94D9584AA545AE), +(65867,'Mac','A64','WoWC',0x0DD10D0707BA2A0ECF88D0660D942C78), +(65867,'Mac','x64','WoW',0x2D024D99A63AA2CD7C6717D3A372CDF7), +(65867,'Mac','x64','WoWC',0x7B7821FD41AB4ABCF97621669167D534), +(65867,'Win','A64','WoW',0x00C8DB00702C2AADAF8520D4581ACAE4), +(65867,'Win','x64','WoW',0x2DA62BB150688DCD24D757838FDA7BA4), +(65867,'Win','x64','WoWC',0xFA6B7796330EBC6E56F5C80B3B1E0279); /*!40000 ALTER TABLE `build_auth_key` ENABLE KEYS */; UNLOCK TABLES; @@ -1828,7 +1849,10 @@ INSERT INTO `build_info` VALUES (65560,12,0,0,NULL), (65655,12,0,0,NULL), (65699,12,0,0,NULL), -(65727,12,0,0,NULL); +(65727,12,0,0,NULL), +(65818,12,0,1,NULL), +(65848,12,0,1,NULL), +(65867,12,0,1,NULL); /*!40000 ALTER TABLE `build_info` ENABLE KEYS */; UNLOCK TABLES; @@ -3441,7 +3465,7 @@ CREATE TABLE `realmlist` ( `timezone` tinyint unsigned NOT NULL DEFAULT '0', `allowedSecurityLevel` tinyint unsigned NOT NULL DEFAULT '0', `population` float NOT NULL DEFAULT '0', - `gamebuild` int unsigned NOT NULL DEFAULT '65727', + `gamebuild` int unsigned NOT NULL DEFAULT '65867', `Region` tinyint unsigned NOT NULL DEFAULT '1', `Battlegroup` tinyint unsigned NOT NULL DEFAULT '1', PRIMARY KEY (`id`), @@ -3456,7 +3480,7 @@ CREATE TABLE `realmlist` ( LOCK TABLES `realmlist` WRITE; /*!40000 ALTER TABLE `realmlist` DISABLE KEYS */; INSERT INTO `realmlist` VALUES -(1,'Trinity','127.0.0.1','127.0.0.1',NULL,NULL,'255.255.255.0',8085,0,0,1,0,0,65727,1,1); +(1,'Trinity','127.0.0.1','127.0.0.1',NULL,NULL,'255.255.255.0',8085,0,0,1,0,0,65867,1,1); /*!40000 ALTER TABLE `realmlist` ENABLE KEYS */; UNLOCK TABLES; @@ -3995,7 +4019,8 @@ INSERT INTO `updates` VALUES ('2026_01_30_00_auth.sql','DCE6882AB5D5897F7CEB863196325712F6313E14','ARCHIVED','2026-01-30 23:22:28',0), ('2026_02_04_00_auth.sql','18BCC2CAF3BA13A50150F8A8E9078A7C531B680E','ARCHIVED','2026-02-04 18:21:17',0), ('2026_02_04_01_auth.sql','3A5F1A3E997F02441E343B2CDD9EF01B921FAEF7','ARCHIVED','2026-02-04 22:09:16',0), -('2026_02_06_00_auth.sql','F29E48E3791FE01F16BDAFF1A029EF997DE5F8F1','ARCHIVED','2026-02-06 12:45:48',0); +('2026_02_06_00_auth.sql','F29E48E3791FE01F16BDAFF1A029EF997DE5F8F1','ARCHIVED','2026-02-06 12:45:48',0), +('2026_02_12_00_auth.sql','CBAC50FC054EEC00B2B475645DD85AFF51104B61','RELEASED','2026-02-12 19:50:33',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/master/2026_02_12_00_auth.sql b/sql/updates/auth/master/2026_02_12_00_auth.sql new file mode 100644 index 0000000000..320be293c3 --- /dev/null +++ b/sql/updates/auth/master/2026_02_12_00_auth.sql @@ -0,0 +1,39 @@ +DELETE FROM `build_info` WHERE `build` IN (65818,65848,65867); +INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES +(65818,12,0,1,NULL), +(65848,12,0,1,NULL), +(65867,12,0,1,NULL); + +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC'; +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC'; +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Win' AND `arch`='A64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Win' AND `arch`='x64' AND `type`='WoW'; +DELETE FROM `build_auth_key` WHERE `build` IN (65818,65848,65867) AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC'; +INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES +(65818,'Mac','A64','WoW',0xF5F5FDB55355B846D75F9DD662859DE6), +(65818,'Mac','A64','WoWC',0x7C22D043962282E5AE79F4727FDD08A7), +(65818,'Mac','x64','WoW',0xC9F254309AB02D4DE2C69F406CAADD6D), +(65818,'Mac','x64','WoWC',0xD14FA35344953D9B576C776BC6D224A5), +(65818,'Win','A64','WoW',0xD934E6F9FC8ABBBE081EF1CBABB94DE6), +(65818,'Win','x64','WoW',0xF95DA20B62A41FD45A4222AD20806CD6), +(65818,'Win','x64','WoWC',0x31047A65186E5C9D17B73A4D38461705), +(65848,'Mac','A64','WoW',0x6045CAD5A5E2C05BAF489A0C29B589DD), +(65848,'Mac','A64','WoWC',0x219D0EE672094F2ED9B6E9494BE34EED), +(65848,'Mac','x64','WoW',0x39D1A9118ED8CEDE3534613A0558AB44), +(65848,'Mac','x64','WoWC',0x5EE49CAAA70BB66A83C2D51E881C1819), +(65848,'Win','A64','WoW',0x74BF726BEB5BA22E855F0DC6AB72B22C), +(65848,'Win','x64','WoW',0xFC91D5EB0678A0A537E68E68F92E390D), +(65848,'Win','x64','WoWC',0x263884BA5E5536FD5012596F10BDC132), +(65867,'Mac','A64','WoW',0x09FA621C9C012A9A2A94D9584AA545AE), +(65867,'Mac','A64','WoWC',0x0DD10D0707BA2A0ECF88D0660D942C78), +(65867,'Mac','x64','WoW',0x2D024D99A63AA2CD7C6717D3A372CDF7), +(65867,'Mac','x64','WoWC',0x7B7821FD41AB4ABCF97621669167D534), +(65867,'Win','A64','WoW',0x00C8DB00702C2AADAF8520D4581ACAE4), +(65867,'Win','x64','WoW',0x2DA62BB150688DCD24D757838FDA7BA4), +(65867,'Win','x64','WoWC',0xFA6B7796330EBC6E56F5C80B3B1E0279); + +UPDATE `realmlist` SET `gamebuild`=65867 WHERE `gamebuild`=65727; + +ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '65867'; diff --git a/sql/updates/hotfixes/master/2026_02_12_00_hotfixes.sql b/sql/updates/hotfixes/master/2026_02_12_00_hotfixes.sql new file mode 100644 index 0000000000..27fc22cb8a --- /dev/null +++ b/sql/updates/hotfixes/master/2026_02_12_00_hotfixes.sql @@ -0,0 +1,29 @@ +-- +ALTER TABLE `trait_tree` ADD COLUMN `TitleText` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL FIRST; +ALTER TABLE `trait_tree` CHANGE `Unused1000_1` `BaseNodeGroup` int NOT NULL DEFAULT 0 AFTER `TraitSystemID`; +ALTER TABLE `trait_tree` CHANGE `Unused1000_2` `MinZoom` float NOT NULL DEFAULT 0 AFTER `Flags`; +ALTER TABLE `trait_tree` CHANGE `Unused1000_3` `MaxZoom` float NOT NULL DEFAULT 0 AFTER `MinZoom`; +ALTER TABLE `trait_tree` ADD COLUMN `UiTextureKitID` int NOT NULL DEFAULT 0 AFTER `MaxZoom`; + +-- +-- Table structure for table `trait_tree_locale` +-- +DROP TABLE IF EXISTS `trait_tree_locale`; +CREATE TABLE `trait_tree_locale` ( + `ID` int unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `TitleText_lang` text, + `VerifiedBuild` int NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +PARTITION BY LIST COLUMNS(locale) +(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB, + PARTITION esES VALUES IN ('esES') ENGINE = InnoDB, + PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB, + PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB, + PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB, + PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB, + PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB, + PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB, + PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB, + PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 86df74b89e..366a171796 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -1955,9 +1955,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_SYSTEM, "SELECT MAX(ID) + 1 FROM trait_system", CONNECTION_SYNCH); // TraitTree.db2 - PrepareStatement(HOTFIX_SEL_TRAIT_TREE, "SELECT ID, TraitSystemID, Unused1000_1, FirstTraitNodeID, PlayerConditionID, Flags, Unused1000_2, " - "Unused1000_3 FROM trait_tree WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TRAIT_TREE, "SELECT TitleText, ID, TraitSystemID, BaseNodeGroup, FirstTraitNodeID, PlayerConditionID, Flags, MinZoom, " + "MaxZoom, UiTextureKitID FROM trait_tree WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_TREE, "SELECT MAX(ID) + 1 FROM trait_tree", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_TRAIT_TREE, "SELECT ID, TitleText_lang FROM trait_tree_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // TraitTreeLoadout.db2 PrepareStatement(HOTFIX_SEL_TRAIT_TREE_LOADOUT, "SELECT ID, TraitTreeID, ChrSpecializationID FROM trait_tree_loadout" diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index bfefe5cd34..c8010c82c7 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -1131,6 +1131,7 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_TRAIT_TREE, HOTFIX_SEL_TRAIT_TREE_MAX_ID, + HOTFIX_SEL_TRAIT_TREE_LOCALE, HOTFIX_SEL_TRAIT_TREE_LOADOUT, HOTFIX_SEL_TRAIT_TREE_LOADOUT_MAX_ID, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index bdfec57070..f2b0feda89 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -6460,19 +6460,21 @@ struct TraitSystemLoadInfo struct TraitTreeLoadInfo { - static constexpr DB2FieldMeta Fields[8] = + static constexpr DB2FieldMeta Fields[10] = { + { .IsSigned = false, .Type = FT_STRING, .Name = "TitleText" }, { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_INT, .Name = "TraitSystemID" }, - { .IsSigned = true, .Type = FT_INT, .Name = "Unused1000_1" }, + { .IsSigned = true, .Type = FT_INT, .Name = "BaseNodeGroup" }, { .IsSigned = true, .Type = FT_INT, .Name = "FirstTraitNodeID" }, { .IsSigned = true, .Type = FT_INT, .Name = "PlayerConditionID" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, - { .IsSigned = false, .Type = FT_FLOAT, .Name = "Unused1000_2" }, - { .IsSigned = false, .Type = FT_FLOAT, .Name = "Unused1000_3" }, + { .IsSigned = false, .Type = FT_FLOAT, .Name = "MinZoom" }, + { .IsSigned = false, .Type = FT_FLOAT, .Name = "MaxZoom" }, + { .IsSigned = true, .Type = FT_INT, .Name = "UiTextureKitID" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 8, &TraitTreeMeta::Instance, HOTFIX_SEL_TRAIT_TREE }; + static constexpr DB2LoadInfo Instance{ Fields, 10, &TraitTreeMeta::Instance, HOTFIX_SEL_TRAIT_TREE }; }; struct TraitTreeLoadoutLoadInfo diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 4830c79eed..46a9095860 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -10237,7 +10237,7 @@ struct GroundEffectTextureMeta struct GroupFinderActivityMeta { - static constexpr DB2MetaField Fields[19] = + static constexpr DB2MetaField Fields[20] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, @@ -10250,6 +10250,7 @@ struct GroupFinderActivityMeta { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -10265,9 +10266,9 @@ struct GroupFinderActivityMeta .FileDataId = 974813, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 19, - .FileFieldCount = 19, - .LayoutHash = 0x5436E136, + .FieldCount = 20, + .FileFieldCount = 20, + .LayoutHash = 0xC3DB15C2, .Fields = Fields }; }; @@ -13696,7 +13697,7 @@ struct LightDataMeta struct LightParamsMeta { - static constexpr DB2MetaField Fields[30] = + static constexpr DB2MetaField Fields[32] = { { .Type = FT_FLOAT, .ArraySize = 3, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 3, .IsSigned = true }, @@ -13728,6 +13729,8 @@ struct LightParamsMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -13735,9 +13738,9 @@ struct LightParamsMeta .FileDataId = 1334669, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 30, - .FileFieldCount = 30, - .LayoutHash = 0xF34ED6FA, + .FieldCount = 32, + .FileFieldCount = 32, + .LayoutHash = 0xCAE394E7, .Fields = Fields }; }; @@ -23630,8 +23633,9 @@ struct TraitSystemMeta struct TraitTreeMeta { - static constexpr DB2MetaField Fields[8] = + static constexpr DB2MetaField Fields[10] = { + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -23640,16 +23644,17 @@ struct TraitTreeMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = { .FileDataId = 4420305, - .IndexField = 0, - .ParentIndexField = 1, - .FieldCount = 8, - .FileFieldCount = 8, - .LayoutHash = 0xE0C67577, + .IndexField = 1, + .ParentIndexField = 2, + .FieldCount = 10, + .FileFieldCount = 10, + .LayoutHash = 0xFBCDBA8F, .Fields = Fields }; }; @@ -24503,7 +24508,7 @@ struct UIGenericWidgetDisplayMeta struct UIMapPinInfoMeta { - static constexpr DB2MetaField Fields[6] = + static constexpr DB2MetaField Fields[7] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -24511,6 +24516,7 @@ struct UIMapPinInfoMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -24518,9 +24524,9 @@ struct UIMapPinInfoMeta .FileDataId = 6237800, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 6, - .FileFieldCount = 6, - .LayoutHash = 0xE8E5C344, + .FieldCount = 7, + .FileFieldCount = 7, + .LayoutHash = 0x95F2CD4F, .Fields = Fields }; }; @@ -25242,12 +25248,13 @@ struct UiPartyPoseMeta struct UiQuestDetailsThemeMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[5] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -25255,9 +25262,9 @@ struct UiQuestDetailsThemeMeta .FileDataId = 3448518, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 4, - .FileFieldCount = 4, - .LayoutHash = 0xE7D161DC, + .FieldCount = 5, + .FileFieldCount = 5, + .LayoutHash = 0xE7D12547, .Fields = Fields }; }; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index a9f295514b..a56ddd4000 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -4608,14 +4608,16 @@ struct TraitSystemEntry struct TraitTreeEntry { + LocalizedString TitleText; uint32 ID; uint32 TraitSystemID; - int32 Unused1000_1; + int32 BaseNodeGroup; int32 FirstTraitNodeID; int32 PlayerConditionID; int32 Flags; - float Unused1000_2; - float Unused1000_3; + float MinZoom; + float MaxZoom; + int32 UiTextureKitID; EnumFlag GetFlags() const { return static_cast(Flags); } }; diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h b/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h index 8c83e59211..97a732f7f3 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h +++ b/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h @@ -143,7 +143,7 @@ inline void WriteSetFieldUpdate(SetUpdateFieldBase const& set, bool ignoreCha { data << uint8(ignoreChangesMask ? 1 : 0); if (ignoreChangesMask) - UF::WriteSetFieldCreate(set, data, owner, receiver); + UF::WriteSetFieldCreate(set, data, receiver, owner); else { uint16 changesCount = 0; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index ff231aaf45..fc6f13743a 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -881,8 +881,10 @@ void VisibleItem::WriteCreate(ByteBuffer& data, Player const* receiver, Unit con data << int32(ConditionalItemAppearanceID); data << uint16(ItemAppearanceModID); data << uint16(ItemVisual); - data.WriteBit(Field_10); - data.WriteBit(Field_11); + data << uint32(ItemModifiedAppearanceID); + data << uint8(Field_18); + data.WriteBit(HasTransmog); + data.WriteBit(HasIllusion); data.FlushBits(); } @@ -892,17 +894,17 @@ void VisibleItem::WriteUpdate(bool ignoreChangesMask, ByteBuffer& data, Player c if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 8); + data.WriteBits(changesMask.GetBlock(0), 10); if (changesMask[0]) { if (changesMask[1]) { - data.WriteBit(Field_10); + data.WriteBit(HasTransmog); } if (changesMask[2]) { - data.WriteBit(Field_11); + data.WriteBit(HasIllusion); } } data.FlushBits(); @@ -928,19 +930,29 @@ void VisibleItem::WriteUpdate(bool ignoreChangesMask, ByteBuffer& data, Player c { data << uint16(ItemVisual); } + if (changesMask[8]) + { + data << uint32(ItemModifiedAppearanceID); + } + if (changesMask[9]) + { + data << uint8(Field_18); + } } data.FlushBits(); } void VisibleItem::ClearChangesMask() { - Base::ClearChangesMask(Field_10); - Base::ClearChangesMask(Field_11); + Base::ClearChangesMask(HasTransmog); + Base::ClearChangesMask(HasIllusion); Base::ClearChangesMask(ItemID); Base::ClearChangesMask(SecondaryItemModifiedAppearanceID); Base::ClearChangesMask(ConditionalItemAppearanceID); Base::ClearChangesMask(ItemAppearanceModID); Base::ClearChangesMask(ItemVisual); + Base::ClearChangesMask(ItemModifiedAppearanceID); + Base::ClearChangesMask(Field_18); _changesMask.ResetAll(); } @@ -5230,6 +5242,7 @@ void TransmogOutfitMetadata::WriteCreate(ByteBuffer& data, Player const* receive data << uint32(TransmogOutfitID); data << uint8(StampedOptionMainHand); data << uint8(StampedOptionOffHand); + data << float(CostMod); data.WriteBit(Locked); data.FlushBits(); } @@ -5240,6 +5253,7 @@ void TransmogOutfitMetadata::WriteUpdate(bool ignoreChangesMask, ByteBuffer& dat data << uint32(TransmogOutfitID); data << uint8(StampedOptionMainHand); data << uint8(StampedOptionOffHand); + data << float(CostMod); data.WriteBit(Locked); data.FlushBits(); data.FlushBits(); @@ -5251,7 +5265,8 @@ bool TransmogOutfitMetadata::operator==(TransmogOutfitMetadata const& right) con && SituationTrigger == right.SituationTrigger && TransmogOutfitID == right.TransmogOutfitID && StampedOptionMainHand == right.StampedOptionMainHand - && StampedOptionOffHand == right.StampedOptionOffHand; + && StampedOptionOffHand == right.StampedOptionOffHand + && CostMod == right.CostMod; } void Research::WriteCreate(ByteBuffer& data, Player const* receiver, Player const* owner) const @@ -8907,6 +8922,7 @@ void ConversationData::WriteCreate(EnumFlag fieldVisibilityFlag (*Lines)[i].WriteCreate(data, receiver, owner); } data.WriteBit(DontPlayBroadcastTextSounds); + data.WriteBit(Field_33); data << uint32(Actors.size()); data << uint32(Flags); for (uint32 i = 0; i < Actors.size(); ++i) @@ -8923,7 +8939,7 @@ void ConversationData::WriteUpdate(EnumFlag fieldVisibilityFlag void ConversationData::WriteUpdate(Mask const& changesMask, ByteBuffer& data, Player const* receiver, Conversation const* owner, bool ignoreNestedChangesMask) const { - data.WriteBits(changesMask.GetBlock(0), 7); + data.WriteBits(changesMask.GetBlock(0), 8); if (changesMask[0]) { @@ -8932,6 +8948,10 @@ void ConversationData::WriteUpdate(Mask const& changesMask, ByteBuffer& data, Pl data.WriteBit(DontPlayBroadcastTextSounds); } if (changesMask[2]) + { + data.WriteBit(Field_33); + } + if (changesMask[3]) { data.WriteBits(Lines->size(), 32); for (uint32 i = 0; i < Lines->size(); ++i) @@ -8943,7 +8963,7 @@ void ConversationData::WriteUpdate(Mask const& changesMask, ByteBuffer& data, Pl data.FlushBits(); if (changesMask[0]) { - if (changesMask[3]) + if (changesMask[4]) { if (!ignoreNestedChangesMask) Actors.WriteUpdateMask(data); @@ -8954,7 +8974,7 @@ void ConversationData::WriteUpdate(Mask const& changesMask, ByteBuffer& data, Pl data.FlushBits(); if (changesMask[0]) { - if (changesMask[3]) + if (changesMask[4]) { for (uint32 i = 0; i < Actors.size(); ++i) { @@ -8964,15 +8984,15 @@ void ConversationData::WriteUpdate(Mask const& changesMask, ByteBuffer& data, Pl } } } - if (changesMask[4]) + if (changesMask[5]) { data << int32(ViewerDependentValue::GetValue(this, receiver, owner)); } - if (changesMask[5]) + if (changesMask[6]) { data << uint32(Progress); } - if (changesMask[6]) + if (changesMask[7]) { data << uint32(Flags); } @@ -8983,6 +9003,7 @@ void ConversationData::WriteUpdate(Mask const& changesMask, ByteBuffer& data, Pl void ConversationData::ClearChangesMask() { Base::ClearChangesMask(DontPlayBroadcastTextSounds); + Base::ClearChangesMask(Field_33); Base::ClearChangesMask(Lines); Base::ClearChangesMask(Actors); Base::ClearChangesMask(LastLineEndTime); @@ -10346,20 +10367,20 @@ void PlayerInitiativeTaskInfo::ClearChangesMask() void NICompletedMilestoneEntry::WriteCreate(ByteBuffer& data, Player const* receiver, Player const* owner) const { - data << uint32(MilestoneID); data << int64(AwardDate); + data << uint32(MilestoneID); } void NICompletedMilestoneEntry::WriteUpdate(bool ignoreChangesMask, ByteBuffer& data, Player const* receiver, Player const* owner) const { - data << uint32(MilestoneID); data << int64(AwardDate); + data << uint32(MilestoneID); } bool NICompletedMilestoneEntry::operator==(NICompletedMilestoneEntry const& right) const { - return MilestoneID == right.MilestoneID - && AwardDate == right.AwardDate; + return AwardDate == right.AwardDate + && MilestoneID == right.MilestoneID; } void NICompletedInitiativesEntry::WriteCreate(ByteBuffer& data, Player const* receiver, Player const* owner) const diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 684445051d..602f2740a5 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -252,15 +252,17 @@ struct UnitChannel : public IsUpdateFieldStructureTag bool operator!=(UnitChannel const& right) const { return !(*this == right); } }; -struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<8> +struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<10> { - UpdateField Field_10; - UpdateField Field_11; + UpdateField HasTransmog; + UpdateField HasIllusion; UpdateField ItemID; UpdateField SecondaryItemModifiedAppearanceID; UpdateField ConditionalItemAppearanceID; UpdateField ItemAppearanceModID; UpdateField ItemVisual; + UpdateField ItemModifiedAppearanceID; + UpdateField Field_18; using OwnerObject = Unit; void WriteCreate(ByteBuffer& data, Player const* receiver, Unit const* owner) const; @@ -1257,6 +1259,7 @@ struct TransmogOutfitMetadata : public IsUpdateFieldStructureTag uint32 TransmogOutfitID = 0; uint8 StampedOptionMainHand = 0; uint8 StampedOptionOffHand = 0; + float CostMod = 0.0f; // Used only with SPELL_AURA_MOD_TRANSMOG_OUTFIT_UPDATE_COST using OwnerObject = Player; void WriteCreate(ByteBuffer& data, Player const* receiver, Player const* owner) const; @@ -1813,15 +1816,16 @@ struct ConversationActor : public IsUpdateFieldStructureTag bool operator!=(ConversationActor const& right) const { return !(*this == right); } }; -struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<7> +struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<8> { UpdateField DontPlayBroadcastTextSounds; - UpdateField, 0, 2> Lines; - DynamicUpdateField Actors; - UpdateField LastLineEndTime; + UpdateField Field_33; // UNK: Prevents line lookup from succeeding + UpdateField, 0, 3> Lines; + DynamicUpdateField Actors; + UpdateField LastLineEndTime; struct LastLineEndTimeTag : ViewerDependentValueTag {}; - UpdateField Progress; - UpdateField Flags; + UpdateField Progress; + UpdateField Flags; using OwnerObject = Conversation; void WriteCreate(EnumFlag fieldVisibilityFlags, ByteBuffer& data, Player const* receiver, Conversation const* owner) const; @@ -2187,8 +2191,8 @@ struct PlayerInitiativeTaskInfo : public IsUpdateFieldStructureTag, public HasCh struct NICompletedMilestoneEntry : public IsUpdateFieldStructureTag { - uint32 MilestoneID = 0; int64 AwardDate = 0; + uint32 MilestoneID = 0; using OwnerObject = Player; void WriteCreate(ByteBuffer& data, Player const* receiver, Player const* owner) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1a8c443fec..276a8d6f7b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -11815,6 +11815,7 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem) SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::SecondaryItemModifiedAppearanceID), pItem->GetVisibleSecondaryModifiedAppearanceId(this)); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemAppearanceModID), pItem->GetVisibleAppearanceModId(this)); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemVisual), pItem->GetVisibleItemVisual(this)); + SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemModifiedAppearanceID), pItem->GetVisibleModifiedAppearanceId(this)); } else { @@ -11822,6 +11823,7 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem) SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::SecondaryItemModifiedAppearanceID), 0); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemAppearanceModID), 0); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemVisual), 0); + SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemModifiedAppearanceID), 0); } } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index fc97def355..7b8ad0d002 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -302,7 +302,7 @@ SpellSchoolMask ProcEventInfo::GetSchoolMask() const SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, SpellInfo const* _spellInfo, SpellCastVisual spellVisual, uint32 _schoolMask, ObjectGuid _castId) : target(_target), attacker(_attacker), castId(_castId), Spell(_spellInfo), SpellVisual(spellVisual), damage(0), originalDamage(0), - schoolMask(_schoolMask), absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth()) + schoolMask(_schoolMask), absorb(0), resist(0), periodicLog(false), blocked(0), reflectingSpellId(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth()) { } @@ -2152,7 +2152,8 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit absorbLog.AbsorbSpellID = absorbAurEff->GetId(); absorbLog.Absorbed = currentAbsorb; absorbLog.OriginalHeal = healInfo.GetOriginalHeal(); - healInfo.GetTarget()->SendMessageToSet(absorbLog.Write(), true); + absorbLog.LogData.Initialize(healInfo.GetTarget()); + healInfo.GetTarget()->SendCombatLogMessage(&absorbLog); } } } @@ -5547,6 +5548,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) packet.Absorbed = log->absorb; packet.Resisted = log->resist; packet.ShieldBlock = log->blocked; + packet.ReflectingSpellID = log->reflectingSpellId; packet.Periodic = log->periodicLog; packet.Flags = log->HitInfo; @@ -5639,7 +5641,7 @@ void Unit::SendSpellDamageImmune(Unit* target, uint32 spellId, bool isPeriodic) void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) { WorldPackets::CombatLog::AttackerStateUpdate packet; - packet.HitInfo = damageInfo->HitInfo; + packet.Flags = damageInfo->HitInfo; packet.AttackerGUID = damageInfo->Attacker->GetGUID(); packet.VictimGUID = damageInfo->Target->GetGUID(); packet.Damage = damageInfo->Damage; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 921aa94e46..9461350655 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -567,6 +567,7 @@ struct TC_GAME_API SpellNonMeleeDamage uint32 resist; bool periodicLog; uint32 blocked; + uint32 reflectingSpellId; uint32 HitInfo; // Used for help uint32 cleanDamage; diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 572683b389..0929e01f49 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -6685,69 +6685,71 @@ enum ResponseCodes CHAR_CREATE_TIMEOUT = 47, CHAR_CREATE_THROTTLE = 48, CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT = 49, - CHAR_CREATE_CHARACTER_IN_COMMUNITY = 50, - CHAR_CREATE_NEW_PLAYER = 51, - CHAR_CREATE_NAME_RESERVATION_FULL = 52, - CHAR_CREATE_DRACTHYR_DUPLICATE = 53, - CHAR_CREATE_DRACTHYR_LEVEL_REQUIREMENT = 54, - CHAR_CREATE_DEATHKNIGHT_DUPLICATE = 55, - CHAR_CREATE_DEATHKNIGHT_LEVEL_REQUIREMENT = 56, - CHAR_CREATE_CLASS_TRIAL_NEWCOMER = 57, - CHAR_CREATE_CLASS_TRIAL_THROTTLE_HOUR = 58, - CHAR_CREATE_CLASS_TRIAL_THROTTLE_DAY = 59, - CHAR_CREATE_CLASS_TRIAL_THROTTLE_WEEK = 60, - CHAR_CREATE_CLASS_TRIAL_THROTTLE_ACCOUNT = 61, - CHAR_CREATE_FACTION_BALANCE = 62, - CHAR_CREATE_TIMERUNNING = 63, + CHAR_CREATE_RACECLASS_ACHIEVEMENT = 50, + CHAR_CREATE_CHARACTER_IN_COMMUNITY = 51, + CHAR_CREATE_NEW_PLAYER = 52, + CHAR_CREATE_NAME_RESERVATION_FULL = 53, + CHAR_CREATE_DRACTHYR_DUPLICATE = 54, + CHAR_CREATE_DRACTHYR_LEVEL_REQUIREMENT = 55, + CHAR_CREATE_DEATHKNIGHT_DUPLICATE = 56, + CHAR_CREATE_DEATHKNIGHT_LEVEL_REQUIREMENT = 57, + CHAR_CREATE_CLASS_TRIAL_NEWCOMER = 58, + CHAR_CREATE_CLASS_TRIAL_THROTTLE_HOUR = 59, + CHAR_CREATE_CLASS_TRIAL_THROTTLE_DAY = 60, + CHAR_CREATE_CLASS_TRIAL_THROTTLE_WEEK = 61, + CHAR_CREATE_CLASS_TRIAL_THROTTLE_ACCOUNT = 62, + CHAR_CREATE_FACTION_BALANCE = 63, + CHAR_CREATE_TIMERUNNING = 64, - CHAR_DELETE_IN_PROGRESS = 64, - CHAR_DELETE_SUCCESS = 65, - CHAR_DELETE_FAILED = 66, - CHAR_DELETE_FAILED_CHARACTER_SERVICE_PENDING = 67, - CHAR_DELETE_FAILED_GUILD_LEADER = 68, - CHAR_DELETE_FAILED_ARENA_CAPTAIN = 69, - CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 70, - CHAR_DELETE_FAILED_DEPRECATED1 = 71, - CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 72, - CHAR_DELETE_FAILED_DEPRECATED2 = 73, - CHAR_DELETE_FAILED_COMMUNITY_OWNER = 74, + CHAR_DELETE_IN_PROGRESS = 65, + CHAR_DELETE_SUCCESS = 66, + CHAR_DELETE_FAILED = 67, + CHAR_DELETE_FAILED_CHARACTER_SERVICE_PENDING = 68, + CHAR_DELETE_FAILED_GUILD_LEADER = 69, + CHAR_DELETE_FAILED_ARENA_CAPTAIN = 70, + CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 71, + CHAR_DELETE_FAILED_DEPRECATED1 = 72, + CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 73, + CHAR_DELETE_FAILED_DEPRECATED2 = 74, + CHAR_DELETE_FAILED_COMMUNITY_OWNER = 75, + CHAR_DELETE_FAILED_NEIGHBORHOOD_OWNER = 76, + CHAR_DELETE_FAILED_HOUSE_OWNER = 77, - CHAR_LOGIN_IN_PROGRESS = 75, - CHAR_LOGIN_SUCCESS = 76, - CHAR_LOGIN_NO_WORLD = 77, - CHAR_LOGIN_DUPLICATE_CHARACTER = 78, - CHAR_LOGIN_NO_INSTANCES = 79, - CHAR_LOGIN_FAILED = 80, - CHAR_LOGIN_DISABLED = 81, - CHAR_LOGIN_NO_CHARACTER = 82, - CHAR_LOGIN_LOCKED_FOR_TRANSFER = 83, - CHAR_LOGIN_LOCKED_BY_BILLING = 84, - CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 85, - CHAR_LOGIN_TEMPORARY_GM_LOCK = 86, - CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 87, - CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 88, - CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 89, - CHAR_LOGIN_LOCKED_BY_RESTRICTION = 90, - CHAR_LOGIN_LOCKED_FOR_REALM_PLAYTYPE = 91, + CHAR_LOGIN_IN_PROGRESS = 78, + CHAR_LOGIN_SUCCESS = 79, + CHAR_LOGIN_NO_WORLD = 80, + CHAR_LOGIN_DUPLICATE_CHARACTER = 81, + CHAR_LOGIN_NO_INSTANCES = 82, + CHAR_LOGIN_FAILED = 83, + CHAR_LOGIN_DISABLED = 84, + CHAR_LOGIN_NO_CHARACTER = 85, + CHAR_LOGIN_LOCKED_FOR_TRANSFER = 86, + CHAR_LOGIN_LOCKED_BY_BILLING = 87, + CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 88, + CHAR_LOGIN_TEMPORARY_GM_LOCK = 89, + CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 90, + CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 91, + CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 92, + CHAR_LOGIN_LOCKED_BY_RESTRICTION = 93, + CHAR_LOGIN_LOCKED_FOR_REALM_PLAYTYPE = 94, - CHAR_NAME_SUCCESS = 92, - CHAR_NAME_FAILURE = 93, - CHAR_NAME_NO_NAME = 94, - CHAR_NAME_TOO_SHORT = 95, - CHAR_NAME_TOO_LONG = 96, - CHAR_NAME_INVALID_CHARACTER = 97, - CHAR_NAME_MIXED_LANGUAGES = 98, - CHAR_NAME_PROFANE = 99, - CHAR_NAME_RESERVED = 100, - CHAR_NAME_INVALID_APOSTROPHE = 101, - CHAR_NAME_MULTIPLE_APOSTROPHES = 102, - CHAR_NAME_THREE_CONSECUTIVE = 103, - CHAR_NAME_INVALID_SPACE = 104, - CHAR_NAME_CONSECUTIVE_SPACES = 105, - CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 106, - CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 107, - CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 108, - CHAR_NAME_SPACES_DISALLOWED = 109, + CHAR_NAME_SUCCESS = 95, + CHAR_NAME_FAILURE = 96, + CHAR_NAME_NO_NAME = 97, + CHAR_NAME_TOO_SHORT = 98, + CHAR_NAME_TOO_LONG = 99, + CHAR_NAME_INVALID_CHARACTER = 100, + CHAR_NAME_MIXED_LANGUAGES = 101, + CHAR_NAME_PROFANE = 102, + CHAR_NAME_RESERVED = 103, + CHAR_NAME_INVALID_APOSTROPHE = 104, + CHAR_NAME_MULTIPLE_APOSTROPHES = 105, + CHAR_NAME_THREE_CONSECUTIVE = 106, + CHAR_NAME_INVALID_SPACE = 107, + CHAR_NAME_CONSECUTIVE_SPACES = 108, + CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 109, + CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 110, + CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 111, }; enum CharacterUndeleteResult diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index ad2c672891..2aca50b0c0 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -52,6 +52,7 @@ WorldPacket const* SpellNonMeleeDamageLog::Write() *this << int32(Absorbed); *this << int32(Resisted); *this << int32(ShieldBlock); + *this << int32(ReflectingSpellID); *this << int32(Flags); *this << Size(WorldTextViewers); *this << Size(Supporters); @@ -250,6 +251,8 @@ WorldPacket const* SpellInterruptLog::Write() _worldPacket << Victim; _worldPacket << int32(InterruptedSpellID); _worldPacket << int32(SpellID); + _worldPacket << Bits<1>(HideFromCombatLog); + _worldPacket.FlushBits(); return &_worldPacket; } @@ -306,6 +309,7 @@ WorldPacket const* SpellMissLog::Write() _worldPacket << int32(SpellID); _worldPacket << Caster; _worldPacket << Size(Entries); + _worldPacket << Bits<1>(HideFromCombatLog); for (SpellLogMissEntry const& missEntry : Entries) _worldPacket << missEntry; @@ -361,7 +365,7 @@ WorldPacket const* SpellDamageShield::Write() WorldPacket const* AttackerStateUpdate::Write() { ByteBuffer attackRoundInfo; - attackRoundInfo << uint32(HitInfo); + attackRoundInfo << uint32(Flags); attackRoundInfo << AttackerGUID; attackRoundInfo << VictimGUID; attackRoundInfo << int32(Damage); @@ -373,39 +377,39 @@ WorldPacket const* AttackerStateUpdate::Write() attackRoundInfo << int32(SubDmg->SchoolMask); attackRoundInfo << float(SubDmg->FDamage); attackRoundInfo << int32(SubDmg->Damage); - if (HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) + if (Flags & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) attackRoundInfo << int32(SubDmg->Absorbed); - if (HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) + if (Flags & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) attackRoundInfo << int32(SubDmg->Resisted); } attackRoundInfo << uint8(VictimState); attackRoundInfo << uint32(AttackerState); attackRoundInfo << uint32(MeleeSpellID); - if (HitInfo & HITINFO_BLOCK) + if (Flags & HITINFO_BLOCK) attackRoundInfo << int32(BlockAmount); - if (HitInfo & HITINFO_RAGE_GAIN) + if (Flags & HITINFO_RAGE_GAIN) attackRoundInfo << int32(RageGained); - if (HitInfo & HITINFO_UNK1) + if (Flags & HITINFO_UNK1) { - attackRoundInfo << uint32(UnkState.State1); - attackRoundInfo << float(UnkState.State2); - attackRoundInfo << float(UnkState.State3); - attackRoundInfo << float(UnkState.State4); - attackRoundInfo << float(UnkState.State5); - attackRoundInfo << float(UnkState.State6); - attackRoundInfo << float(UnkState.State7); - attackRoundInfo << float(UnkState.State8); - attackRoundInfo << float(UnkState.State9); - attackRoundInfo << float(UnkState.State10); - attackRoundInfo << float(UnkState.State11); - attackRoundInfo << uint32(UnkState.State12); + attackRoundInfo << uint32(HitInfo.ArmorReduction); + attackRoundInfo << float(HitInfo.CritRollNeeded); + attackRoundInfo << float(HitInfo.CombatRoll); + attackRoundInfo << float(HitInfo.MissChance); + attackRoundInfo << float(HitInfo.DodgeChance); + attackRoundInfo << float(HitInfo.ParryChance); + attackRoundInfo << float(HitInfo.BlockChance); + attackRoundInfo << float(HitInfo.GlanceChance); + attackRoundInfo << float(HitInfo.CrushChance); + attackRoundInfo << float(HitInfo.MinDamage); + attackRoundInfo << float(HitInfo.MaxDamage); + attackRoundInfo << uint32(HitInfo.SinceLastSwing); } - if (HitInfo & (HITINFO_BLOCK | HITINFO_UNK12)) - attackRoundInfo << float(Unk); + if (Flags & (HITINFO_BLOCK | HITINFO_UNK12)) + attackRoundInfo << float(BlockRoll); attackRoundInfo << ContentTuning; @@ -476,18 +480,22 @@ WorldPacket const* SpellAbsorbLog::Write() WorldPacket const* SpellHealAbsorbLog::Write() { - _worldPacket << Target; - _worldPacket << AbsorbCaster; - _worldPacket << Healer; - _worldPacket << int32(AbsorbSpellID); - _worldPacket << int32(AbsorbedSpellID); - _worldPacket << int32(Absorbed); - _worldPacket << int32(OriginalHeal); - _worldPacket << OptionalInit(ContentTuning); - _worldPacket.FlushBits(); + *this << Target; + *this << AbsorbCaster; + *this << Healer; + *this << int32(AbsorbSpellID); + *this << int32(AbsorbedSpellID); + *this << int32(Absorbed); + *this << int32(OriginalHeal); + + WriteLogDataBit(); + *this << OptionalInit(ContentTuning); + FlushBits(); + + WriteLogData(); if (ContentTuning) - _worldPacket << *ContentTuning; + *this << *ContentTuning; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index 7b94d4a922..11fce1e164 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -51,6 +51,7 @@ namespace WorldPackets int32 Overkill = -1; uint8 SchoolMask = 0; int32 ShieldBlock = 0; + int32 ReflectingSpellID = 0; int32 Resisted = 0; bool Periodic = false; int32 Absorbed = 0; @@ -153,6 +154,7 @@ namespace WorldPackets ObjectGuid Victim; int32 InterruptedSpellID = 0; int32 SpellID = 0; + bool HideFromCombatLog = false; }; struct SpellDispellData @@ -230,6 +232,7 @@ namespace WorldPackets int32 SpellID = 0; ObjectGuid Caster; std::vector Entries; + bool HideFromCombatLog = false; }; class ProcResist final : public ServerPacket @@ -285,20 +288,20 @@ namespace WorldPackets int32 Resisted = 0; }; - struct UnkAttackerState + struct HitInfoData { - uint32 State1 = 0; - float State2 = 0.0f; - float State3 = 0.0f; - float State4 = 0.0f; - float State5 = 0.0f; - float State6 = 0.0f; - float State7 = 0.0f; - float State8 = 0.0f; - float State9 = 0.0f; - float State10 = 0.0f; - float State11 = 0.0f; - uint32 State12 = 0; + uint32 ArmorReduction = 0; + float CritRollNeeded = 0.0f; + float CombatRoll = 0.0f; + float MissChance = 0.0f; + float DodgeChance = 0.0f; + float ParryChance = 0.0f; + float BlockChance = 0.0f; + float GlanceChance = 0.0f; + float CrushChance = 0.0f; + float MinDamage = 0.0f; + float MaxDamage = 0.0f; + uint32 SinceLastSwing = 0; }; class AttackerStateUpdate final : public CombatLogServerPacket @@ -308,7 +311,7 @@ namespace WorldPackets WorldPacket const* Write() override; - uint32 HitInfo = 0; // Flags + uint32 Flags = 0; // Flags ObjectGuid AttackerGUID; ObjectGuid VictimGUID; int32 Damage = 0; @@ -320,8 +323,8 @@ namespace WorldPackets uint32 MeleeSpellID = 0; int32 BlockAmount = 0; int32 RageGained = 0; - UnkAttackerState UnkState; - float Unk = 0.0f; + HitInfoData HitInfo; + float BlockRoll = 0.0f; Spells::ContentTuningParams ContentTuning; }; @@ -343,10 +346,10 @@ namespace WorldPackets std::vector Supporters; }; - class SpellHealAbsorbLog final : public ServerPacket + class SpellHealAbsorbLog final : public CombatLogServerPacket { public: - explicit SpellHealAbsorbLog() : ServerPacket(SMSG_SPELL_HEAL_ABSORB_LOG, 100) { } + explicit SpellHealAbsorbLog() : CombatLogServerPacket(SMSG_SPELL_HEAL_ABSORB_LOG, 100) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index d3b01ea4f1..66825d6e41 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -33,6 +33,11 @@ void SpellCastLogData::Initialize(Unit const* unit) AttackPower = unit->GetTotalAttackPowerValue(unit->GetClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); SpellPower = unit->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL); Armor = unit->GetArmor(); + if (Player const* player = unit->ToPlayer()) + { + Versatility = player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) * 100.0f; + Avoidance = player->GetRatingBonusValue(CR_AVOIDANCE) * 100.0f; + } PowerData.emplace_back(int32(unit->GetPowerType()), unit->GetPower(unit->GetPowerType()), int32(0)); } @@ -44,6 +49,11 @@ void SpellCastLogData::Initialize(Spell const* spell) AttackPower = unitCaster->GetTotalAttackPowerValue(unitCaster->GetClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); SpellPower = unitCaster->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL); Armor = unitCaster->GetArmor(); + if (Player const* player = unitCaster->ToPlayer()) + { + Versatility = player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) * 100.0f; + Avoidance = player->GetRatingBonusValue(CR_AVOIDANCE) * 100.0f; + } Powers primaryPowerType = unitCaster->GetPowerType(); bool primaryPowerAdded = false; for (SpellPowerCost const& cost : spell->GetPowerCost()) @@ -161,8 +171,9 @@ ByteBuffer& operator<<(ByteBuffer& data, SpellCastLogData const& spellCastLogDat data << int32(spellCastLogData.AttackPower); data << int32(spellCastLogData.SpellPower); data << int32(spellCastLogData.Armor); - data << int32(spellCastLogData.Unknown_1105_1); - data << int32(spellCastLogData.Unknown_1105_2); + data << int32(spellCastLogData.Versatility); + data << int32(spellCastLogData.Avoidance); + data << Bits<1>(spellCastLogData.HideFromCombatLog); data << BitsSize<9>(spellCastLogData.PowerData); data.FlushBits(); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h index 235bb50ac4..29962ce481 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h @@ -43,8 +43,9 @@ namespace WorldPackets int32 AttackPower = 0; int32 SpellPower = 0; int32 Armor = 0; - int32 Unknown_1105_1 = 0; - int32 Unknown_1105_2 = 0; + int32 Versatility = 0; + int32 Avoidance = 0; + bool HideFromCombatLog = false; std::vector PowerData; void Initialize(Unit const* unit); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index a166799dac..0078899bff 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -135,7 +135,6 @@ namespace WorldPackets int32 CfgRealmRecID = 0; uint32 CommercePricePollTimeSeconds = 0; int64 RedeemForBalanceAmount = 0; - uint32 BpayStorePurchaseTimeout = 0; uint32 ClubsPresenceDelay = 0; uint32 ClubPresenceUnsubscribeDelay = 0; ///< Timer for updating club presence when communities ui frame is hidden uint32 KioskSessionDurationMinutes = 0; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ca7faeda6e..7e64670d18 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -249,6 +249,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_BONUS_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBugReportOpcode); DEFINE_HANDLER(CMSG_BULK_PURCHASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BULK_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode); DEFINE_HANDLER(CMSG_BUY_ACCOUNT_BANK_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankTab); DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuybackItem); @@ -583,6 +584,8 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_HOUSING_GET_CURRENT_HOUSE_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_HOUSING_GET_PLAYER_PERMISSIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_HOUSING_HOUSE_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_HOUSING_PHOTO_SHARING_CLEAR_AUTHORIZATION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_HOUSING_PHOTO_SHARING_COMPLETE_AUTHORIZATION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_HOUSING_RESET_KIOSK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_HOUSING_ROOM_ADD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); @@ -1740,6 +1743,8 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_GET_CURRENT_HOUSE_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_GET_PLAYER_PERMISSIONS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_HOUSE_STATUS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_PHOTO_SHARING_AUTHORIZATION_CLEARED_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_PHOTO_SHARING_AUTHORIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_REDEEM_DEFERRED_DECOR_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_RESET_KIOSK_MODE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOUSING_ROOM_ADD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 2d743d302d..b70ec0317e 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -140,6 +140,7 @@ enum OpcodeClient : uint32 CMSG_BONUS_ROLL = 0x3A0265, CMSG_BUG_REPORT = 0x4000B1, CMSG_BULK_PURCHASE = 0x290032, + CMSG_BULK_REFUND = 0x290033, CMSG_BUSY_TRADE = 0x3A0002, CMSG_BUY_ACCOUNT_BANK_TAB = 0x3B0124, CMSG_BUY_BACK_ITEM = 0x3B0037, @@ -474,6 +475,8 @@ enum OpcodeClient : uint32 CMSG_HOUSING_GET_CURRENT_HOUSE_INFO = 0x350006, CMSG_HOUSING_GET_PLAYER_PERMISSIONS = 0x350007, CMSG_HOUSING_HOUSE_STATUS = 0x350005, + CMSG_HOUSING_PHOTO_SHARING_CLEAR_AUTHORIZATION = 0x4001A0, + CMSG_HOUSING_PHOTO_SHARING_COMPLETE_AUTHORIZATION = 0x40019F, CMSG_HOUSING_RESET_KIOSK_MODE = 0x350008, CMSG_HOUSING_ROOM_ADD = 0x320001, CMSG_HOUSING_ROOM_APPLY_COMPONENT_MATERIALS = 0x320006, @@ -1039,7 +1042,7 @@ enum OpcodeClient : uint32 CMSG_TRANSMOGRIFY_ITEMS = CMSG_REQUEST_SCHEDULED_PVP_INFO + 1, }; -inline constexpr std::size_t NUM_CMSG_OPCODES = 1934; +inline constexpr std::size_t NUM_CMSG_OPCODES = 1938; inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode) { @@ -1065,8 +1068,8 @@ inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode) case 0x3C: return idInGroup < 1 ? idInGroup + 1358 : -1; case 0x3D: return idInGroup < 10 ? idInGroup + 1359 : -1; case 0x3E: return idInGroup < 134 ? idInGroup + 1369 : -1; - case 0x40: return idInGroup < 413 ? idInGroup + 1503 : -1; - case 0x41: return idInGroup < 18 ? idInGroup + 1916 : -1; + case 0x40: return idInGroup < 417 ? idInGroup + 1503 : -1; + case 0x41: return idInGroup < 18 ? idInGroup + 1920 : -1; default: return -1; } } @@ -1348,9 +1351,9 @@ enum OpcodeServer : uint32 SMSG_COMMERCE_TOKEN_UPDATE = 0x42027A, SMSG_COMPLAINT_RESULT = 0x420155, SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x420246, - SMSG_COMPRESSED_PACKET = 0x49000C, + SMSG_COMPRESSED_PACKET = 0x49000D, SMSG_CONFIRM_PARTY_INVITE = 0x4202BC, - SMSG_CONNECT_TO = 0x490007, + SMSG_CONNECT_TO = 0x490008, SMSG_CONSOLE_WRITE = 0x4200DD, SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x420281, SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x420280, @@ -1413,7 +1416,7 @@ enum OpcodeServer : uint32 SMSG_DISPLAY_WORLD_TEXT = 0x420296, SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x620055, SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x420083, - SMSG_DROP_NEW_CONNECTION = 0x490006, + SMSG_DROP_NEW_CONNECTION = 0x490007, SMSG_DUEL_ARRANGED = 0x48001B, SMSG_DUEL_COMPLETE = 0x48001F, SMSG_DUEL_COUNTDOWN = 0x48001E, @@ -1428,7 +1431,7 @@ enum OpcodeServer : uint32 SMSG_ENCOUNTER_END = 0x420227, SMSG_ENCOUNTER_START = 0x420226, SMSG_END_LIGHTNING_STORM = 0x420152, - SMSG_ENTER_ENCRYPTED_MODE = 0x490003, + SMSG_ENTER_ENCRYPTED_MODE = 0x490004, SMSG_ENUM_CHARACTERS_RESULT = 0x420018, SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x42029B, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x62000E, @@ -1660,6 +1663,8 @@ enum OpcodeServer : uint32 SMSG_HOUSING_GET_CURRENT_HOUSE_INFO_RESPONSE = 0x550001, SMSG_HOUSING_GET_PLAYER_PERMISSIONS_RESPONSE = 0x550006, SMSG_HOUSING_HOUSE_STATUS_RESPONSE = 0x550000, + SMSG_HOUSING_PHOTO_SHARING_AUTHORIZATION_CLEARED_RESULT = 0x42037C, + SMSG_HOUSING_PHOTO_SHARING_AUTHORIZATION_RESULT = 0x42037B, SMSG_HOUSING_REDEEM_DEFERRED_DECOR_RESPONSE = 0x510009, SMSG_HOUSING_RESET_KIOSK_MODE_RESPONSE = 0x550007, SMSG_HOUSING_ROOM_ADD_RESPONSE = 0x530001, @@ -1670,33 +1675,33 @@ enum OpcodeServer : uint32 SMSG_HOUSING_ROOM_SET_DOOR_TYPE_RESPONSE = 0x530006, SMSG_HOUSING_ROOM_SET_LAYOUT_EDIT_MODE_RESPONSE = 0x530000, SMSG_HOUSING_ROOM_UPDATE_RESPONSE = 0x530003, - SMSG_HOUSING_SVCS_ACCEPT_NEIGHBORHOOD_OWNERSHIP_RESPONSE = 0x540018, + SMSG_HOUSING_SVCS_ACCEPT_NEIGHBORHOOD_OWNERSHIP_RESPONSE = 0x540017, SMSG_HOUSING_SVCS_CANCEL_RELINQUISH_HOUSE_RESPONSE = 0x540008, - SMSG_HOUSING_SVCS_CHANGE_HOUSE_COSMETIC_OWNER = 0x540011, + SMSG_HOUSING_SVCS_CHANGE_HOUSE_COSMETIC_OWNER = 0x540010, SMSG_HOUSING_SVCS_CLEAR_PLOT_RESERVATION_RESPONSE = 0x540005, SMSG_HOUSING_SVCS_CREATE_CHARTER_NEIGHBORHOOD_RESPONSE = 0x540003, - SMSG_HOUSING_SVCS_DELETE_ALL_NEIGHBORHOOD_INVITES_RESPONSE = 0x540022, - SMSG_HOUSING_SVCS_GET_BNET_FRIEND_NEIGHBORHOODS_RESPONSE = 0x54001F, - SMSG_HOUSING_SVCS_GET_HOUSE_FINDER_INFO_RESPONSE = 0x54001D, - SMSG_HOUSING_SVCS_GET_HOUSE_FINDER_NEIGHBORHOOD_RESPONSE = 0x54001E, - SMSG_HOUSING_SVCS_GET_PLAYER_HOUSES_INFO_RESPONSE = 0x54000C, - SMSG_HOUSING_SVCS_GET_POTENTIAL_HOUSE_OWNERS_RESPONSE = 0x54001B, - SMSG_HOUSING_SVCS_GUILD_ADD_HOUSE_NOTIFICATION = 0x540013, - SMSG_HOUSING_SVCS_GUILD_APPEND_NEIGHBORHOOD_NOTIFICATION = 0x540015, + SMSG_HOUSING_SVCS_DELETE_ALL_NEIGHBORHOOD_INVITES_RESPONSE = 0x540021, + SMSG_HOUSING_SVCS_GET_BNET_FRIEND_NEIGHBORHOODS_RESPONSE = 0x54001E, + SMSG_HOUSING_SVCS_GET_HOUSE_FINDER_INFO_RESPONSE = 0x54001C, + SMSG_HOUSING_SVCS_GET_HOUSE_FINDER_NEIGHBORHOOD_RESPONSE = 0x54001D, + SMSG_HOUSING_SVCS_GET_PLAYER_HOUSES_INFO_RESPONSE = 0x54000B, + SMSG_HOUSING_SVCS_GET_POTENTIAL_HOUSE_OWNERS_RESPONSE = 0x54001A, + SMSG_HOUSING_SVCS_GUILD_ADD_HOUSE_NOTIFICATION = 0x540012, + SMSG_HOUSING_SVCS_GUILD_APPEND_NEIGHBORHOOD_NOTIFICATION = 0x540014, SMSG_HOUSING_SVCS_GUILD_CREATE_NEIGHBORHOOD_NOTIFICATION = 0x540001, - SMSG_HOUSING_SVCS_GUILD_GET_HOUSING_INFO_RESPONSE = 0x540017, - SMSG_HOUSING_SVCS_GUILD_REMOVE_HOUSE_NOTIFICATION = 0x540014, - SMSG_HOUSING_SVCS_GUILD_RENAME_NEIGHBORHOOD_NOTIFICATION = 0x540016, - SMSG_HOUSING_SVCS_HOUSE_FINDER_FORCE_REFRESH = 0x540020, - SMSG_HOUSING_SVCS_NEIGHBORHOOD_OWNERSHIP_TRANSFERRED_RESPONSE = 0x54001A, + SMSG_HOUSING_SVCS_GUILD_GET_HOUSING_INFO_RESPONSE = 0x540016, + SMSG_HOUSING_SVCS_GUILD_REMOVE_HOUSE_NOTIFICATION = 0x540013, + SMSG_HOUSING_SVCS_GUILD_RENAME_NEIGHBORHOOD_NOTIFICATION = 0x540015, + SMSG_HOUSING_SVCS_HOUSE_FINDER_FORCE_REFRESH = 0x54001F, + SMSG_HOUSING_SVCS_NEIGHBORHOOD_OWNERSHIP_TRANSFERRED_RESPONSE = 0x540019, SMSG_HOUSING_SVCS_NEIGHBORHOOD_RESERVE_PLOT_RESPONSE = 0x540004, SMSG_HOUSING_SVCS_NOTIFY_PERMISSIONS_FAILURE = 0x540000, - SMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_RESPONSE = 0x54000D, - SMSG_HOUSING_SVCS_REJECT_NEIGHBORHOOD_OWNERSHIP_RESPONSE = 0x540019, + SMSG_HOUSING_SVCS_PLAYER_VIEW_HOUSES_RESPONSE = 0x54000C, + SMSG_HOUSING_SVCS_REJECT_NEIGHBORHOOD_OWNERSHIP_RESPONSE = 0x540018, SMSG_HOUSING_SVCS_RELINQUISH_HOUSE_RESPONSE = 0x540007, - SMSG_HOUSING_SVCS_UPDATE_HOUSES_LEVEL_FAVOR = 0x540012, - SMSG_HOUSING_SVCS_UPDATE_HOUSE_SETTINGS_RESPONSE = 0x54001C, - SMSG_HOUSING_SVC_REQUEST_PLAYER_RELOAD_DATA = 0x540021, + SMSG_HOUSING_SVCS_UPDATE_HOUSES_LEVEL_FAVOR = 0x540011, + SMSG_HOUSING_SVCS_UPDATE_HOUSE_SETTINGS_RESPONSE = 0x54001B, + SMSG_HOUSING_SVC_REQUEST_PLAYER_RELOAD_DATA = 0x540020, SMSG_INITIALIZE_FACTIONS = 0x4201CC, SMSG_INITIAL_SETUP = 0x420014, SMSG_INITIATIVE_COMPLETE = 0x420363, @@ -1956,7 +1961,7 @@ enum OpcodeServer : uint32 SMSG_MOVE_UPDATE_TELEPORT = 0x5A000F, SMSG_MOVE_UPDATE_TURN_RATE = 0x5A000B, SMSG_MOVE_UPDATE_WALK_SPEED = 0x5A0006, - SMSG_MULTIPLE_PACKETS = 0x49000B, + SMSG_MULTIPLE_PACKETS = 0x49000C, SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x420287, SMSG_MULTI_FLOOR_NEW_FLOOR = 0x420286, SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x4200B2, @@ -2096,7 +2101,7 @@ enum OpcodeServer : uint32 SMSG_PLAY_SPELL_VISUAL = 0x620038, SMSG_PLAY_SPELL_VISUAL_KIT = 0x62003C, SMSG_PLAY_TIME_WARNING = 0x4201A7, - SMSG_PONG = 0x490008, + SMSG_PONG = 0x490009, SMSG_POWER_UPDATE = 0x42017C, SMSG_PRELOAD_CHILD_MAP = 0x42000D, SMSG_PRELOAD_WORLD = 0x42002C, @@ -2195,7 +2200,7 @@ enum OpcodeServer : uint32 SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x420025, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x480014, SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x480015, - SMSG_RESET_COMPRESSION_CONTEXT = 0x490009, + SMSG_RESET_COMPRESSION_CONTEXT = 0x49000A, SMSG_RESET_FAILED_NOTIFY = 0x420161, SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x420340, SMSG_RESET_QUEST_POI = 0x600020, @@ -2209,7 +2214,7 @@ enum OpcodeServer : uint32 SMSG_RESTRICTED_ACCOUNT_WARNING = 0x42005C, SMSG_RESUME_CAST = 0x62002E, SMSG_RESUME_CAST_BAR = 0x620031, - SMSG_RESUME_COMMS = 0x490005, + SMSG_RESUME_COMMS = 0x490006, SMSG_RESUME_TOKEN = 0x420041, SMSG_RESURRECT_REQUEST = 0x420012, SMSG_RESYNC_RUNES = 0x620052, @@ -2344,7 +2349,7 @@ enum OpcodeServer : uint32 SMSG_SUMMON_REQUEST = 0x4201CA, SMSG_SUPERCEDED_SPELLS = 0x62003F, SMSG_SURVEY_DELIVERED = 0x420360, - SMSG_SUSPEND_COMMS = 0x490004, + SMSG_SUSPEND_COMMS = 0x490005, SMSG_SUSPEND_TOKEN = 0x420040, SMSG_SYNC_WOW_ENTITLEMENTS = 0x4202FC, SMSG_TALENTS_INVOLUNTARILY_RESET = 0x4201C1, @@ -2461,39 +2466,39 @@ enum OpcodeServer : uint32 SMSG_ARENA_TEAM_STATS = UNKNOWN_OPCODE, }; -inline constexpr std::size_t NUM_SMSG_OPCODES = 1636; +inline constexpr std::size_t NUM_SMSG_OPCODES = 1638; inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeServer opcode) { uint32 idInGroup = opcode & 0xFFFF; switch (opcode >> 16) { - case 0x42: return idInGroup < 891 ? idInGroup + 0 : -1; - case 0x43: return idInGroup < 5 ? idInGroup + 891 : -1; - case 0x46: return idInGroup < 20 ? idInGroup + 896 : -1; - case 0x47: return idInGroup < 36 ? idInGroup + 916 : -1; - case 0x48: return idInGroup < 49 ? idInGroup + 952 : -1; - case 0x49: return idInGroup < 13 ? idInGroup + 1001 : -1; - case 0x4A: return idInGroup < 12 ? idInGroup + 1014 : -1; - case 0x4C: return idInGroup < 82 ? idInGroup + 1026 : -1; - case 0x4E: return idInGroup < 72 ? idInGroup + 1108 : -1; - case 0x50: return idInGroup < 2 ? idInGroup + 1180 : -1; - case 0x51: return idInGroup < 11 ? idInGroup + 1182 : -1; - case 0x52: return idInGroup < 8 ? idInGroup + 1193 : -1; - case 0x53: return idInGroup < 8 ? idInGroup + 1201 : -1; - case 0x54: return idInGroup < 36 ? idInGroup + 1209 : -1; - case 0x55: return idInGroup < 8 ? idInGroup + 1245 : -1; - case 0x56: return idInGroup < 34 ? idInGroup + 1253 : -1; - case 0x58: return idInGroup < 1 ? idInGroup + 1287 : -1; - case 0x5A: return idInGroup < 122 ? idInGroup + 1288 : -1; - case 0x5B: return idInGroup < 6 ? idInGroup + 1410 : -1; - case 0x5C: return idInGroup < 23 ? idInGroup + 1416 : -1; - case 0x5E: return idInGroup < 8 ? idInGroup + 1439 : -1; - case 0x5F: return idInGroup < 52 ? idInGroup + 1447 : -1; - case 0x60: return idInGroup < 41 ? idInGroup + 1499 : -1; - case 0x62: return idInGroup < 87 ? idInGroup + 1540 : -1; - case 0x63: return idInGroup < 8 ? idInGroup + 1627 : -1; - case 0x65: return idInGroup < 1 ? idInGroup + 1635 : -1; + case 0x42: return idInGroup < 893 ? idInGroup + 0 : -1; + case 0x43: return idInGroup < 5 ? idInGroup + 893 : -1; + case 0x46: return idInGroup < 20 ? idInGroup + 898 : -1; + case 0x47: return idInGroup < 36 ? idInGroup + 918 : -1; + case 0x48: return idInGroup < 49 ? idInGroup + 954 : -1; + case 0x49: return idInGroup < 14 ? idInGroup + 1003 : -1; + case 0x4A: return idInGroup < 12 ? idInGroup + 1017 : -1; + case 0x4C: return idInGroup < 82 ? idInGroup + 1029 : -1; + case 0x4E: return idInGroup < 72 ? idInGroup + 1111 : -1; + case 0x50: return idInGroup < 2 ? idInGroup + 1183 : -1; + case 0x51: return idInGroup < 11 ? idInGroup + 1185 : -1; + case 0x52: return idInGroup < 8 ? idInGroup + 1196 : -1; + case 0x53: return idInGroup < 8 ? idInGroup + 1204 : -1; + case 0x54: return idInGroup < 35 ? idInGroup + 1212 : -1; + case 0x55: return idInGroup < 8 ? idInGroup + 1247 : -1; + case 0x56: return idInGroup < 34 ? idInGroup + 1255 : -1; + case 0x58: return idInGroup < 1 ? idInGroup + 1289 : -1; + case 0x5A: return idInGroup < 122 ? idInGroup + 1290 : -1; + case 0x5B: return idInGroup < 6 ? idInGroup + 1412 : -1; + case 0x5C: return idInGroup < 23 ? idInGroup + 1418 : -1; + case 0x5E: return idInGroup < 8 ? idInGroup + 1441 : -1; + case 0x5F: return idInGroup < 52 ? idInGroup + 1449 : -1; + case 0x60: return idInGroup < 41 ? idInGroup + 1501 : -1; + case 0x62: return idInGroup < 87 ? idInGroup + 1542 : -1; + case 0x63: return idInGroup < 8 ? idInGroup + 1629 : -1; + case 0x65: return idInGroup < 1 ? idInGroup + 1637 : -1; default: return -1; } } diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 23a6b26224..6ab522d838 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -739,7 +739,7 @@ enum AuraType : uint32 SPELL_AURA_652 = 652, SPELL_AURA_653 = 653, SPELL_AURA_654 = 654, - SPELL_AURA_REMOVE_TRANSMOG_OUTFIT_UPDATE_COST = 655, + SPELL_AURA_MOD_TRANSMOG_OUTFIT_UPDATE_COST = 655, TOTAL_AURAS }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 65408d210e..12091e5e2a 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -724,7 +724,7 @@ NonDefaultConstructible AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //652 &AuraEffect::HandleNULL, //653 &AuraEffect::HandleNULL, //654 - &AuraEffect::HandleNULL, //655 SPELL_AURA_REMOVE_TRANSMOG_OUTFIT_UPDATE_COST + &AuraEffect::HandleNULL, //655 SPELL_AURA_MOD_TRANSMOG_OUTFIT_UPDATE_COST }; AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster) : diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 912b9d4ee0..d097b9257b 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2491,6 +2491,9 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= false /*can't reflect twice*/, false /*immunity will be checked after complete EffectMask is known*/); + if (targetInfo.ReflectResult == SPELL_MISS_MISS && target->HasAuraType(SPELL_AURA_REFLECT_SPELLS)) + targetInfo.ReflectingSpellId = target->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS).front()->GetId(); + // Proc spell reflect aura when missile hits the original target target->m_Events.AddEvent(new ProcReflectDelayed(target, m_originalCasterGUID), target->m_Events.CalculateTime(Milliseconds(targetInfo.TimeDelay))); @@ -2900,6 +2903,7 @@ void Spell::TargetInfo::DoDamageAndTriggers(Spell* spell) hasDamage = true; // Fill base damage struct (unitTarget - is real spell target) SpellNonMeleeDamage damageInfo(caster, spell->unitTarget, spell->m_spellInfo, spell->m_SpellVisual, spell->m_spellSchoolMask, spell->m_castId); + damageInfo.reflectingSpellId = ReflectingSpellId; // Check damage immunity if (spell->unitTarget->IsImmunedToDamage(caster, spell->m_spellInfo)) { diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 06d667bb21..d902252d17 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -841,9 +841,11 @@ class TC_GAME_API Spell uint64 TimeDelay = 0ULL; int32 Damage = 0; int32 Healing = 0; + bool Positive = true; SpellMissInfo MissCondition = SPELL_MISS_NONE; SpellMissInfo ReflectResult = SPELL_MISS_NONE; + uint32 ReflectingSpellId = 0; bool IsAlive = false; bool IsCrit = false; @@ -852,7 +854,6 @@ class TC_GAME_API Spell DiminishingGroup DRGroup = DIMINISHING_NONE; int32 AuraDuration = 0; int32 AuraBasePoints[MAX_SPELL_EFFECTS] = { }; - bool Positive = true; UnitAura* HitAura = nullptr; ProcFlagsHit ProcHitMask = { };