aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/characters_database.sql60
-rw-r--r--sql/updates/characters/cata_classic/2024_09_01_00_characters.sql2
-rw-r--r--sql/updates/hotfixes/cata_classic/2024_09_01_01_hotfixes.sql26
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp9
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h9
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp121
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h74
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp23
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h334
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp48
-rw-r--r--src/server/game/DataStores/DB2Stores.h24
-rw-r--r--src/server/game/DataStores/DB2Structure.h226
-rw-r--r--src/server/game/Entities/Player/Player.cpp746
-rw-r--r--src/server/game/Entities/Player/Player.h31
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp8
-rw-r--r--src/server/game/Handlers/TraitHandler.cpp259
-rw-r--r--src/server/game/Miscellaneous/CommonHelpers.cpp1
-rw-r--r--src/server/game/Server/Packets/AllPackets.h1
-rw-r--r--src/server/game/Server/Packets/TraitPackets.cpp68
-rw-r--r--src/server/game/Server/Packets/TraitPackets.h106
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp12
-rw-r--r--src/server/game/Server/WorldSession.h17
-rw-r--r--src/server/game/Spells/Spell.cpp8
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp46
-rw-r--r--src/server/game/Spells/TraitMgr.cpp748
-rw-r--r--src/server/game/Spells/TraitMgr.h87
-rw-r--r--src/server/game/World/World.cpp4
28 files changed, 49 insertions, 3051 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql
index c4d6e126c41..b156dc50965 100644
--- a/sql/base/characters_database.sql
+++ b/sql/base/characters_database.sql
@@ -1600,63 +1600,6 @@ LOCK TABLES `character_talent_group` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `character_trait_config`
---
-
-DROP TABLE IF EXISTS `character_trait_config`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `character_trait_config` (
- `guid` bigint unsigned NOT NULL,
- `traitConfigId` int NOT NULL,
- `type` int NOT NULL,
- `chrSpecializationId` int DEFAULT NULL,
- `combatConfigFlags` int DEFAULT NULL,
- `localIdentifier` int DEFAULT NULL,
- `skillLineId` int DEFAULT NULL,
- `traitSystemId` int DEFAULT NULL,
- `name` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
- PRIMARY KEY (`guid`,`traitConfigId`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `character_trait_config`
---
-
-LOCK TABLES `character_trait_config` WRITE;
-/*!40000 ALTER TABLE `character_trait_config` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_trait_config` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `character_trait_entry`
---
-
-DROP TABLE IF EXISTS `character_trait_entry`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `character_trait_entry` (
- `guid` bigint unsigned NOT NULL,
- `traitConfigId` int NOT NULL,
- `traitNodeId` int NOT NULL,
- `traitNodeEntryId` int NOT NULL,
- `rank` int NOT NULL DEFAULT '0',
- `grantedRanks` int NOT NULL DEFAULT '0',
- PRIMARY KEY (`guid`,`traitConfigId`,`traitNodeId`,`traitNodeEntryId`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `character_trait_entry`
---
-
-LOCK TABLES `character_trait_entry` WRITE;
-/*!40000 ALTER TABLE `character_trait_entry` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_trait_entry` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `character_transmog_outfits`
--
@@ -3436,7 +3379,8 @@ INSERT INTO `updates` VALUES
('2024_06_25_00_characters.sql','046AC59E8B828B0C81A1A3C79860E464D96228B8','RELEASED','2024-06-25 17:56:15',0),
('2024_07_27_00_characters.sql','912ADCAC4948C75386387251D6FAEFB841574606','RELEASED','2024-07-27 01:03:05',0),
('2024_07_28_00_characters.sql','22C94D231C155686691780B65C12FCC2B4C3A6AA','RELEASED','2024-07-28 00:59:04',0),
-('2024_08_27_00_characters_2024_08_26_00_characters.sql','68EEBE1D639D59B24F5121008C2D103CA67FFC9A','RELEASED','2024-08-27 17:15:49',0);
+('2024_08_27_00_characters_2024_08_26_00_characters.sql','68EEBE1D639D59B24F5121008C2D103CA67FFC9A','RELEASED','2024-08-27 17:15:49',0),
+('2024_09_01_00_characters.sql','B921A034AFAB2BFFF3EDA6EE9AB3152EFE503734','RELEASED','2024-09-01 20:45:47',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/characters/cata_classic/2024_09_01_00_characters.sql b/sql/updates/characters/cata_classic/2024_09_01_00_characters.sql
new file mode 100644
index 00000000000..aaacfd4d2f7
--- /dev/null
+++ b/sql/updates/characters/cata_classic/2024_09_01_00_characters.sql
@@ -0,0 +1,2 @@
+DROP TABLE IF EXISTS `character_trait_entry`;
+DROP TABLE IF EXISTS `character_trait_config`;
diff --git a/sql/updates/hotfixes/cata_classic/2024_09_01_01_hotfixes.sql b/sql/updates/hotfixes/cata_classic/2024_09_01_01_hotfixes.sql
new file mode 100644
index 00000000000..20eea0bdcc3
--- /dev/null
+++ b/sql/updates/hotfixes/cata_classic/2024_09_01_01_hotfixes.sql
@@ -0,0 +1,26 @@
+DROP TABLE IF EXISTS `skill_line_x_trait_tree`;
+DROP TABLE IF EXISTS `trait_cond`;
+DROP TABLE IF EXISTS `trait_cost`;
+DROP TABLE IF EXISTS `trait_currency`;
+DROP TABLE IF EXISTS `trait_currency_source`;
+DROP TABLE IF EXISTS `trait_currency_source_locale`;
+DROP TABLE IF EXISTS `trait_definition`;
+DROP TABLE IF EXISTS `trait_definition_locale`;
+DROP TABLE IF EXISTS `trait_definition_effect_points`;
+DROP TABLE IF EXISTS `trait_edge`;
+DROP TABLE IF EXISTS `trait_node`;
+DROP TABLE IF EXISTS `trait_node_entry`;
+DROP TABLE IF EXISTS `trait_node_entry_x_trait_cond`;
+DROP TABLE IF EXISTS `trait_node_entry_x_trait_cost`;
+DROP TABLE IF EXISTS `trait_node_group`;
+DROP TABLE IF EXISTS `trait_node_group_x_trait_cond`;
+DROP TABLE IF EXISTS `trait_node_group_x_trait_cost`;
+DROP TABLE IF EXISTS `trait_node_group_x_trait_node`;
+DROP TABLE IF EXISTS `trait_node_x_trait_cond`;
+DROP TABLE IF EXISTS `trait_node_x_trait_cost`;
+DROP TABLE IF EXISTS `trait_node_x_trait_node_entry`;
+DROP TABLE IF EXISTS `trait_tree`;
+DROP TABLE IF EXISTS `trait_tree_loadout`;
+DROP TABLE IF EXISTS `trait_tree_loadout_entry`;
+DROP TABLE IF EXISTS `trait_tree_x_trait_cost`;
+DROP TABLE IF EXISTS `trait_tree_x_trait_currency`;
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index 1466894c248..b0a70d96193 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -587,7 +587,6 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_INS_CHAR_ACTION, "INSERT INTO character_action (guid, spec, traitConfigId, button, action, type) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHAR_ACTION, "UPDATE character_action SET action = ?, type = ? WHERE guid = ? AND button = ? AND spec = ? AND traitConfigId = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, "DELETE FROM character_action WHERE guid = ? and button = ? and spec = ? AND traitConfigId = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_DEL_CHAR_ACTION_BY_TRAIT_CONFIG, "DELETE FROM character_action WHERE guid = ? AND traitConfigId = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM, "DELETE FROM character_inventory WHERE item = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, "DELETE FROM character_inventory WHERE bag = ? AND slot = ? AND guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_MAIL, "UPDATE mail SET has_items = ?, expire_time = ?, deliver_time = ?, money = ?, cod = ?, checked = ? WHERE id = ?", CONNECTION_ASYNC);
@@ -622,14 +621,6 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_UPD_CHAR_LIST_SLOT, "UPDATE characters SET slot = ? WHERE guid = ? AND account = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_FISHINGSTEPS, "INSERT INTO character_fishingsteps (guid, fishingSteps) VALUES (?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_SEL_CHAR_TRAIT_ENTRIES, "SELECT traitConfigId, traitNodeId, traitNodeEntryId, `rank`, grantedRanks FROM character_trait_entry WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_INS_CHAR_TRAIT_ENTRIES, "INSERT INTO character_trait_entry (guid, traitConfigId, traitNodeId, traitNodeEntryId, `rank`, grantedRanks) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PrepareStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES, "DELETE FROM character_trait_entry WHERE guid = ? AND traitConfigId = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES_BY_CHAR, "DELETE FROM character_trait_entry WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_SEL_CHAR_TRAIT_CONFIGS, "SELECT traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, `name` FROM character_trait_config WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_INS_CHAR_TRAIT_CONFIGS, "INSERT INTO character_trait_config (guid, traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, `name`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PrepareStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS, "DELETE FROM character_trait_config WHERE guid = ? AND traitConfigId = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS_BY_CHAR, "DELETE FROM character_trait_config WHERE guid = ?", CONNECTION_ASYNC);
// Void Storage
PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC);
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h
index 932bc244281..29ec166535f 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.h
+++ b/src/server/database/Database/Implementation/CharacterDatabase.h
@@ -473,7 +473,6 @@ enum CharacterDatabaseStatements : uint32
CHAR_INS_CHAR_ACTION,
CHAR_UPD_CHAR_ACTION,
CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC,
- CHAR_DEL_CHAR_ACTION_BY_TRAIT_CONFIG,
CHAR_DEL_CHAR_INVENTORY_BY_ITEM,
CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT,
CHAR_UPD_MAIL,
@@ -506,14 +505,6 @@ enum CharacterDatabaseStatements : uint32
CHAR_UPD_CHAR_LIST_SLOT,
CHAR_INS_CHAR_FISHINGSTEPS,
CHAR_DEL_CHAR_FISHINGSTEPS,
- CHAR_SEL_CHAR_TRAIT_ENTRIES,
- CHAR_INS_CHAR_TRAIT_ENTRIES,
- CHAR_DEL_CHAR_TRAIT_ENTRIES,
- CHAR_DEL_CHAR_TRAIT_ENTRIES_BY_CHAR,
- CHAR_SEL_CHAR_TRAIT_CONFIGS,
- CHAR_INS_CHAR_TRAIT_CONFIGS,
- CHAR_DEL_CHAR_TRAIT_CONFIGS,
- CHAR_DEL_CHAR_TRAIT_CONFIGS_BY_CHAR,
CHAR_SEL_CHAR_VOID_STORAGE,
CHAR_REP_CHAR_VOID_STORAGE_ITEM,
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index d8659e8b827..96aa1e561fc 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -1139,11 +1139,6 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"CharacterPoints1, CharacterPoints2 FROM skill_line_ability WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT MAX(ID) + 1 FROM skill_line_ability", CONNECTION_SYNCH);
- // SkillLineXTraitTree.db2
- PrepareStatement(HOTFIX_SEL_SKILL_LINE_X_TRAIT_TREE, "SELECT ID, SkillLineID, TraitTreeID, OrderIndex FROM skill_line_x_trait_tree"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_SKILL_LINE_X_TRAIT_TREE, "SELECT MAX(ID) + 1 FROM skill_line_x_trait_tree", CONNECTION_SYNCH);
-
// SkillRaceClassInfo.db2
PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID, "
"Unknown115_1 FROM skill_race_class_info WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
@@ -1438,122 +1433,6 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRANSMOG_HOLIDAY, "SELECT MAX(ID) + 1 FROM transmog_holiday", CONNECTION_SYNCH);
- // TraitCond.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_COND, "SELECT ID, CondType, TraitTreeID, GrantedRanks, QuestID, AchievementID, SpecSetID, TraitNodeGroupID, "
- "TraitNodeID, TraitCurrencyID, SpentAmountRequired, Flags, RequiredLevel, FreeSharedStringID, SpendMoreSharedStringID FROM trait_cond"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_COND, "SELECT MAX(ID) + 1 FROM trait_cond", CONNECTION_SYNCH);
-
- // TraitCost.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_COST, "SELECT InternalName, ID, Amount, TraitCurrencyID FROM trait_cost WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_COST, "SELECT MAX(ID) + 1 FROM trait_cost", CONNECTION_SYNCH);
-
- // TraitCurrency.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_CURRENCY, "SELECT ID, Type, CurrencyTypesID, Flags, Icon FROM trait_currency WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_CURRENCY, "SELECT MAX(ID) + 1 FROM trait_currency", CONNECTION_SYNCH);
-
- // TraitCurrencySource.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_CURRENCY_SOURCE, "SELECT Requirement, ID, TraitCurrencyID, Amount, QuestID, AchievementID, PlayerLevel, "
- "TraitNodeEntryID, OrderIndex FROM trait_currency_source WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_CURRENCY_SOURCE, "SELECT MAX(ID) + 1 FROM trait_currency_source", CONNECTION_SYNCH);
- PREPARE_LOCALE_STMT(HOTFIX_SEL_TRAIT_CURRENCY_SOURCE, "SELECT ID, Requirement_lang FROM trait_currency_source_locale"
- " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
-
- // TraitDefinition.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_DEFINITION, "SELECT OverrideName, OverrideSubtext, OverrideDescription, ID, SpellID, OverrideIcon, "
- "OverridesSpellID, VisibleSpellID FROM trait_definition WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_DEFINITION, "SELECT MAX(ID) + 1 FROM trait_definition", CONNECTION_SYNCH);
- PREPARE_LOCALE_STMT(HOTFIX_SEL_TRAIT_DEFINITION, "SELECT ID, OverrideName_lang, OverrideSubtext_lang, OverrideDescription_lang"
- " FROM trait_definition_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
-
- // TraitDefinitionEffectPoints.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_DEFINITION_EFFECT_POINTS, "SELECT ID, TraitDefinitionID, EffectIndex, OperationType, CurveID"
- " FROM trait_definition_effect_points WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_DEFINITION_EFFECT_POINTS, "SELECT MAX(ID) + 1 FROM trait_definition_effect_points", CONNECTION_SYNCH);
-
- // TraitEdge.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_EDGE, "SELECT ID, VisualStyle, LeftTraitNodeID, RightTraitNodeID, Type FROM trait_edge"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_EDGE, "SELECT MAX(ID) + 1 FROM trait_edge", CONNECTION_SYNCH);
-
- // TraitNode.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE, "SELECT ID, TraitTreeID, PosX, PosY, Type, Flags FROM trait_node WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE, "SELECT MAX(ID) + 1 FROM trait_node", CONNECTION_SYNCH);
-
- // TraitNodeEntry.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_ENTRY, "SELECT ID, TraitDefinitionID, MaxRanks, NodeEntryType FROM trait_node_entry"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_ENTRY, "SELECT MAX(ID) + 1 FROM trait_node_entry", CONNECTION_SYNCH);
-
- // TraitNodeEntryXTraitCond.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COND, "SELECT ID, TraitCondID, TraitNodeEntryID FROM trait_node_entry_x_trait_cond"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COND, "SELECT MAX(ID) + 1 FROM trait_node_entry_x_trait_cond", CONNECTION_SYNCH);
-
- // TraitNodeEntryXTraitCost.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COST, "SELECT ID, TraitNodeEntryID, TraitCostID FROM trait_node_entry_x_trait_cost"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COST, "SELECT MAX(ID) + 1 FROM trait_node_entry_x_trait_cost", CONNECTION_SYNCH);
-
- // TraitNodeGroup.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_GROUP, "SELECT ID, TraitTreeID, Flags FROM trait_node_group WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_GROUP, "SELECT MAX(ID) + 1 FROM trait_node_group", CONNECTION_SYNCH);
-
- // TraitNodeGroupXTraitCond.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COND, "SELECT ID, TraitCondID, TraitNodeGroupID FROM trait_node_group_x_trait_cond"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COND, "SELECT MAX(ID) + 1 FROM trait_node_group_x_trait_cond", CONNECTION_SYNCH);
-
- // TraitNodeGroupXTraitCost.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COST, "SELECT ID, TraitNodeGroupID, TraitCostID FROM trait_node_group_x_trait_cost"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COST, "SELECT MAX(ID) + 1 FROM trait_node_group_x_trait_cost", CONNECTION_SYNCH);
-
- // TraitNodeGroupXTraitNode.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_NODE, "SELECT ID, TraitNodeGroupID, TraitNodeID, `Index` FROM trait_node_group_x_trait_node"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_NODE, "SELECT MAX(ID) + 1 FROM trait_node_group_x_trait_node", CONNECTION_SYNCH);
-
- // TraitNodeXTraitCond.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COND, "SELECT ID, TraitCondID, TraitNodeID FROM trait_node_x_trait_cond"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COND, "SELECT MAX(ID) + 1 FROM trait_node_x_trait_cond", CONNECTION_SYNCH);
-
- // TraitNodeXTraitCost.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COST, "SELECT ID, TraitNodeID, TraitCostID FROM trait_node_x_trait_cost"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COST, "SELECT MAX(ID) + 1 FROM trait_node_x_trait_cost", CONNECTION_SYNCH);
-
- // TraitNodeXTraitNodeEntry.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_NODE_X_TRAIT_NODE_ENTRY, "SELECT ID, TraitNodeID, TraitNodeEntryID, `Index` FROM trait_node_x_trait_node_entry"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_NODE_X_TRAIT_NODE_ENTRY, "SELECT MAX(ID) + 1 FROM trait_node_x_trait_node_entry", CONNECTION_SYNCH);
-
- // TraitTree.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_TREE, "SELECT ID, TraitSystemID, TraitTreeID, FirstTraitNodeID, PlayerConditionID, Flags, Unused1000_2, "
- "Unused1000_3 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);
-
- // TraitTreeLoadout.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_TREE_LOADOUT, "SELECT ID, TraitTreeID, ChrSpecializationID FROM trait_tree_loadout"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_TREE_LOADOUT, "SELECT MAX(ID) + 1 FROM trait_tree_loadout", CONNECTION_SYNCH);
-
- // TraitTreeLoadoutEntry.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_TREE_LOADOUT_ENTRY, "SELECT ID, TraitTreeLoadoutID, SelectedTraitNodeID, SelectedTraitNodeEntryID, NumPoints, "
- "OrderIndex FROM trait_tree_loadout_entry WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_TREE_LOADOUT_ENTRY, "SELECT MAX(ID) + 1 FROM trait_tree_loadout_entry", CONNECTION_SYNCH);
-
- // TraitTreeXTraitCost.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_TREE_X_TRAIT_COST, "SELECT ID, TraitTreeID, TraitCostID FROM trait_tree_x_trait_cost"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_TREE_X_TRAIT_COST, "SELECT MAX(ID) + 1 FROM trait_tree_x_trait_cost", CONNECTION_SYNCH);
-
- // TraitTreeXTraitCurrency.db2
- PrepareStatement(HOTFIX_SEL_TRAIT_TREE_X_TRAIT_CURRENCY, "SELECT ID, `Index`, TraitTreeID, TraitCurrencyID FROM trait_tree_x_trait_currency"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
- PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_TREE_X_TRAIT_CURRENCY, "SELECT MAX(ID) + 1 FROM trait_tree_x_trait_currency", CONNECTION_SYNCH);
-
// TransmogSet.db2
PrepareStatement(HOTFIX_SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, "
"ParentTransmogSetID, ExpansionID, UiOrder FROM transmog_set WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 333e192d9af..36aa6d9cb27 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -660,9 +660,6 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_SKILL_LINE_ABILITY,
HOTFIX_SEL_SKILL_LINE_ABILITY_MAX_ID,
- HOTFIX_SEL_SKILL_LINE_X_TRAIT_TREE,
- HOTFIX_SEL_SKILL_LINE_X_TRAIT_TREE_MAX_ID,
-
HOTFIX_SEL_SKILL_RACE_CLASS_INFO,
HOTFIX_SEL_SKILL_RACE_CLASS_INFO_MAX_ID,
@@ -830,77 +827,6 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_TRANSMOG_HOLIDAY,
HOTFIX_SEL_TRANSMOG_HOLIDAY_MAX_ID,
- HOTFIX_SEL_TRAIT_COND,
- HOTFIX_SEL_TRAIT_COND_MAX_ID,
-
- HOTFIX_SEL_TRAIT_COST,
- HOTFIX_SEL_TRAIT_COST_MAX_ID,
-
- HOTFIX_SEL_TRAIT_CURRENCY,
- HOTFIX_SEL_TRAIT_CURRENCY_MAX_ID,
-
- HOTFIX_SEL_TRAIT_CURRENCY_SOURCE,
- HOTFIX_SEL_TRAIT_CURRENCY_SOURCE_MAX_ID,
- HOTFIX_SEL_TRAIT_CURRENCY_SOURCE_LOCALE,
-
- HOTFIX_SEL_TRAIT_DEFINITION,
- HOTFIX_SEL_TRAIT_DEFINITION_MAX_ID,
- HOTFIX_SEL_TRAIT_DEFINITION_LOCALE,
-
- HOTFIX_SEL_TRAIT_DEFINITION_EFFECT_POINTS,
- HOTFIX_SEL_TRAIT_DEFINITION_EFFECT_POINTS_MAX_ID,
-
- HOTFIX_SEL_TRAIT_EDGE,
- HOTFIX_SEL_TRAIT_EDGE_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE,
- HOTFIX_SEL_TRAIT_NODE_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_ENTRY,
- HOTFIX_SEL_TRAIT_NODE_ENTRY_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COND,
- HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COND_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COST,
- HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COST_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_GROUP,
- HOTFIX_SEL_TRAIT_NODE_GROUP_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COND,
- HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COND_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COST,
- HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COST_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_NODE,
- HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_NODE_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COND,
- HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COND_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COST,
- HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COST_MAX_ID,
-
- HOTFIX_SEL_TRAIT_NODE_X_TRAIT_NODE_ENTRY,
- HOTFIX_SEL_TRAIT_NODE_X_TRAIT_NODE_ENTRY_MAX_ID,
-
- HOTFIX_SEL_TRAIT_TREE,
- HOTFIX_SEL_TRAIT_TREE_MAX_ID,
-
- HOTFIX_SEL_TRAIT_TREE_LOADOUT,
- HOTFIX_SEL_TRAIT_TREE_LOADOUT_MAX_ID,
-
- HOTFIX_SEL_TRAIT_TREE_LOADOUT_ENTRY,
- HOTFIX_SEL_TRAIT_TREE_LOADOUT_ENTRY_MAX_ID,
-
- HOTFIX_SEL_TRAIT_TREE_X_TRAIT_COST,
- HOTFIX_SEL_TRAIT_TREE_X_TRAIT_COST_MAX_ID,
-
- HOTFIX_SEL_TRAIT_TREE_X_TRAIT_CURRENCY,
- HOTFIX_SEL_TRAIT_TREE_X_TRAIT_CURRENCY_MAX_ID,
-
HOTFIX_SEL_TRANSMOG_SET,
HOTFIX_SEL_TRANSMOG_SET_MAX_ID,
HOTFIX_SEL_TRANSMOG_SET_LOCALE,
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 9b661b6409d..bc3418a6fa3 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -3337,28 +3337,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
return false;
break;
case ModifierTreeType::PlayerHasAtLeastProfPathRanks: // 355
- {
- auto traitNodeEntryRankCount = [referencePlayer, secondaryAsset]()
- {
- uint32 ranks = 0;
- for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs)
- {
- if (TraitConfigType(*traitConfig.Type) != TraitConfigType::Profession)
- continue;
-
- if (*traitConfig.SkillLineID != int32(secondaryAsset))
- continue;
-
- for (UF::TraitEntry const& traitEntry : traitConfig.Entries)
- if (sTraitNodeEntryStore.AssertEntry(traitEntry.TraitNodeEntryID)->GetNodeEntryType() == TraitNodeEntryType::ProfPath)
- ranks += traitEntry.Rank + traitEntry.GrantedRanks;
- }
- return ranks;
- }();
- if (traitNodeEntryRankCount < reqValue)
- return false;
- break;
- }
+ return false;
case ModifierTreeType::PlayerHasItemTransmogrifiedToItemModifiedAppearance: // 358
{
ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(reqValue);
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index 1b6011a2038..90229afcbf3 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -3827,19 +3827,6 @@ struct SkillLineAbilityLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 17, &SkillLineAbilityMeta::Instance, HOTFIX_SEL_SKILL_LINE_ABILITY };
};
-struct SkillLineXTraitTreeLoadInfo
-{
- static constexpr DB2FieldMeta Fields[4] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "SkillLineID" },
- { true, FT_INT, "TraitTreeID" },
- { true, FT_INT, "OrderIndex" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 4, &SkillLineXTraitTreeMeta::Instance, HOTFIX_SEL_SKILL_LINE_X_TRAIT_TREE };
-};
-
struct SkillRaceClassInfoLoadInfo
{
static constexpr DB2FieldMeta Fields[9] =
@@ -4874,327 +4861,6 @@ struct TransmogHolidayLoadInfo
static constexpr DB2LoadInfo Instance{ Fields, 2, &TransmogHolidayMeta::Instance, HOTFIX_SEL_TRANSMOG_HOLIDAY };
};
-struct TraitCondLoadInfo
-{
- static constexpr DB2FieldMeta Fields[15] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "CondType" },
- { false, FT_INT, "TraitTreeID" },
- { true, FT_INT, "GrantedRanks" },
- { true, FT_INT, "QuestID" },
- { true, FT_INT, "AchievementID" },
- { true, FT_INT, "SpecSetID" },
- { true, FT_INT, "TraitNodeGroupID" },
- { true, FT_INT, "TraitNodeID" },
- { true, FT_INT, "TraitCurrencyID" },
- { true, FT_INT, "SpentAmountRequired" },
- { true, FT_INT, "Flags" },
- { true, FT_INT, "RequiredLevel" },
- { true, FT_INT, "FreeSharedStringID" },
- { true, FT_INT, "SpendMoreSharedStringID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 15, &TraitCondMeta::Instance, HOTFIX_SEL_TRAIT_COND };
-};
-
-struct TraitCostLoadInfo
-{
- static constexpr DB2FieldMeta Fields[4] =
- {
- { false, FT_STRING_NOT_LOCALIZED, "InternalName" },
- { false, FT_INT, "ID" },
- { true, FT_INT, "Amount" },
- { true, FT_INT, "TraitCurrencyID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 4, &TraitCostMeta::Instance, HOTFIX_SEL_TRAIT_COST };
-};
-
-struct TraitCurrencyLoadInfo
-{
- static constexpr DB2FieldMeta Fields[5] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "Type" },
- { true, FT_INT, "CurrencyTypesID" },
- { true, FT_INT, "Flags" },
- { true, FT_INT, "Icon" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 5, &TraitCurrencyMeta::Instance, HOTFIX_SEL_TRAIT_CURRENCY };
-};
-
-struct TraitCurrencySourceLoadInfo
-{
- static constexpr DB2FieldMeta Fields[9] =
- {
- { false, FT_STRING, "Requirement" },
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitCurrencyID" },
- { true, FT_INT, "Amount" },
- { true, FT_INT, "QuestID" },
- { true, FT_INT, "AchievementID" },
- { true, FT_INT, "PlayerLevel" },
- { true, FT_INT, "TraitNodeEntryID" },
- { true, FT_INT, "OrderIndex" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 9, &TraitCurrencySourceMeta::Instance, HOTFIX_SEL_TRAIT_CURRENCY_SOURCE };
-};
-
-struct TraitDefinitionLoadInfo
-{
- static constexpr DB2FieldMeta Fields[8] =
- {
- { false, FT_STRING, "OverrideName" },
- { false, FT_STRING, "OverrideSubtext" },
- { false, FT_STRING, "OverrideDescription" },
- { false, FT_INT, "ID" },
- { true, FT_INT, "SpellID" },
- { true, FT_INT, "OverrideIcon" },
- { true, FT_INT, "OverridesSpellID" },
- { true, FT_INT, "VisibleSpellID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 8, &TraitDefinitionMeta::Instance, HOTFIX_SEL_TRAIT_DEFINITION };
-};
-
-struct TraitDefinitionEffectPointsLoadInfo
-{
- static constexpr DB2FieldMeta Fields[5] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitDefinitionID" },
- { true, FT_INT, "EffectIndex" },
- { true, FT_INT, "OperationType" },
- { true, FT_INT, "CurveID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 5, &TraitDefinitionEffectPointsMeta::Instance, HOTFIX_SEL_TRAIT_DEFINITION_EFFECT_POINTS };
-};
-
-struct TraitEdgeLoadInfo
-{
- static constexpr DB2FieldMeta Fields[5] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "VisualStyle" },
- { false, FT_INT, "LeftTraitNodeID" },
- { true, FT_INT, "RightTraitNodeID" },
- { true, FT_INT, "Type" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 5, &TraitEdgeMeta::Instance, HOTFIX_SEL_TRAIT_EDGE };
-};
-
-struct TraitNodeLoadInfo
-{
- static constexpr DB2FieldMeta Fields[6] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitTreeID" },
- { true, FT_INT, "PosX" },
- { true, FT_INT, "PosY" },
- { false, FT_BYTE, "Type" },
- { true, FT_INT, "Flags" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 6, &TraitNodeMeta::Instance, HOTFIX_SEL_TRAIT_NODE };
-};
-
-struct TraitNodeEntryLoadInfo
-{
- static constexpr DB2FieldMeta Fields[4] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "TraitDefinitionID" },
- { true, FT_INT, "MaxRanks" },
- { false, FT_BYTE, "NodeEntryType" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 4, &TraitNodeEntryMeta::Instance, HOTFIX_SEL_TRAIT_NODE_ENTRY };
-};
-
-struct TraitNodeEntryXTraitCondLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "TraitCondID" },
- { false, FT_INT, "TraitNodeEntryID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeEntryXTraitCondMeta::Instance, HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COND };
-};
-
-struct TraitNodeEntryXTraitCostLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitNodeEntryID" },
- { true, FT_INT, "TraitCostID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeEntryXTraitCostMeta::Instance, HOTFIX_SEL_TRAIT_NODE_ENTRY_X_TRAIT_COST };
-};
-
-struct TraitNodeGroupLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitTreeID" },
- { true, FT_INT, "Flags" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeGroupMeta::Instance, HOTFIX_SEL_TRAIT_NODE_GROUP };
-};
-
-struct TraitNodeGroupXTraitCondLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "TraitCondID" },
- { false, FT_INT, "TraitNodeGroupID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeGroupXTraitCondMeta::Instance, HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COND };
-};
-
-struct TraitNodeGroupXTraitCostLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitNodeGroupID" },
- { true, FT_INT, "TraitCostID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeGroupXTraitCostMeta::Instance, HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_COST };
-};
-
-struct TraitNodeGroupXTraitNodeLoadInfo
-{
- static constexpr DB2FieldMeta Fields[4] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitNodeGroupID" },
- { true, FT_INT, "TraitNodeID" },
- { true, FT_INT, "Index" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 4, &TraitNodeGroupXTraitNodeMeta::Instance, HOTFIX_SEL_TRAIT_NODE_GROUP_X_TRAIT_NODE };
-};
-
-struct TraitNodeXTraitCondLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "TraitCondID" },
- { false, FT_INT, "TraitNodeID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeXTraitCondMeta::Instance, HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COND };
-};
-
-struct TraitNodeXTraitCostLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitNodeID" },
- { true, FT_INT, "TraitCostID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitNodeXTraitCostMeta::Instance, HOTFIX_SEL_TRAIT_NODE_X_TRAIT_COST };
-};
-
-struct TraitNodeXTraitNodeEntryLoadInfo
-{
- static constexpr DB2FieldMeta Fields[4] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitNodeID" },
- { true, FT_INT, "TraitNodeEntryID" },
- { true, FT_INT, "Index" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 4, &TraitNodeXTraitNodeEntryMeta::Instance, HOTFIX_SEL_TRAIT_NODE_X_TRAIT_NODE_ENTRY };
-};
-
-struct TraitTreeLoadInfo
-{
- static constexpr DB2FieldMeta Fields[8] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitSystemID" },
- { true, FT_INT, "TraitTreeID" },
- { true, FT_INT, "FirstTraitNodeID" },
- { true, FT_INT, "PlayerConditionID" },
- { true, FT_INT, "Flags" },
- { false, FT_FLOAT, "Unused1000_2" },
- { false, FT_FLOAT, "Unused1000_3" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 8, &TraitTreeMeta::Instance, HOTFIX_SEL_TRAIT_TREE };
-};
-
-struct TraitTreeLoadoutLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitTreeID" },
- { true, FT_INT, "ChrSpecializationID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitTreeLoadoutMeta::Instance, HOTFIX_SEL_TRAIT_TREE_LOADOUT };
-};
-
-struct TraitTreeLoadoutEntryLoadInfo
-{
- static constexpr DB2FieldMeta Fields[6] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitTreeLoadoutID" },
- { true, FT_INT, "SelectedTraitNodeID" },
- { true, FT_INT, "SelectedTraitNodeEntryID" },
- { true, FT_INT, "NumPoints" },
- { true, FT_INT, "OrderIndex" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 6, &TraitTreeLoadoutEntryMeta::Instance, HOTFIX_SEL_TRAIT_TREE_LOADOUT_ENTRY };
-};
-
-struct TraitTreeXTraitCostLoadInfo
-{
- static constexpr DB2FieldMeta Fields[3] =
- {
- { false, FT_INT, "ID" },
- { false, FT_INT, "TraitTreeID" },
- { true, FT_INT, "TraitCostID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 3, &TraitTreeXTraitCostMeta::Instance, HOTFIX_SEL_TRAIT_TREE_X_TRAIT_COST };
-};
-
-struct TraitTreeXTraitCurrencyLoadInfo
-{
- static constexpr DB2FieldMeta Fields[4] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "Index" },
- { false, FT_INT, "TraitTreeID" },
- { true, FT_INT, "TraitCurrencyID" },
- };
-
- static constexpr DB2LoadInfo Instance{ Fields, 4, &TraitTreeXTraitCurrencyMeta::Instance, HOTFIX_SEL_TRAIT_TREE_X_TRAIT_CURRENCY };
-};
-
struct TransmogSetLoadInfo
{
static constexpr DB2FieldMeta Fields[10] =
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 49bdc688635..3a12c8fd540 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -231,7 +231,6 @@ DB2Storage<SceneScriptTextEntry> sSceneScriptTextStore("SceneScri
DB2Storage<ServerMessagesEntry> sServerMessagesStore("ServerMessages.db2", &ServerMessagesLoadInfo::Instance);
DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", &SkillLineLoadInfo::Instance);
DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", &SkillLineAbilityLoadInfo::Instance);
-DB2Storage<SkillLineXTraitTreeEntry> sSkillLineXTraitTreeStore("SkillLineXTraitTree.db2", &SkillLineXTraitTreeLoadInfo::Instance);
DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", &SkillRaceClassInfoLoadInfo::Instance);
DB2Storage<SoundKitEntry> sSoundKitStore("SoundKit.db2", &SoundKitLoadInfo::Instance);
DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore("SpellAuraOptions.db2", &SpellAuraOptionsLoadInfo::Instance);
@@ -283,29 +282,6 @@ DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", &
DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", &TaxiPathNodeLoadInfo::Instance);
DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", &TotemCategoryLoadInfo::Instance);
DB2Storage<ToyEntry> sToyStore("Toy.db2", &ToyLoadInfo::Instance);
-DB2Storage<TraitCondEntry> sTraitCondStore("TraitCond.db2", &TraitCondLoadInfo::Instance);
-DB2Storage<TraitCostEntry> sTraitCostStore("TraitCost.db2", &TraitCostLoadInfo::Instance);
-DB2Storage<TraitCurrencyEntry> sTraitCurrencyStore("TraitCurrency.db2", &TraitCurrencyLoadInfo::Instance);
-DB2Storage<TraitCurrencySourceEntry> sTraitCurrencySourceStore("TraitCurrencySource.db2", &TraitCurrencySourceLoadInfo::Instance);
-DB2Storage<TraitDefinitionEntry> sTraitDefinitionStore("TraitDefinition.db2", &TraitDefinitionLoadInfo::Instance);
-DB2Storage<TraitDefinitionEffectPointsEntry> sTraitDefinitionEffectPointsStore("TraitDefinitionEffectPoints.db2", &TraitDefinitionEffectPointsLoadInfo::Instance);
-DB2Storage<TraitEdgeEntry> sTraitEdgeStore("TraitEdge.db2", &TraitEdgeLoadInfo::Instance);
-DB2Storage<TraitNodeEntry> sTraitNodeStore("TraitNode.db2", &TraitNodeLoadInfo::Instance);
-DB2Storage<TraitNodeEntryEntry> sTraitNodeEntryStore("TraitNodeEntry.db2", &TraitNodeEntryLoadInfo::Instance);
-DB2Storage<TraitNodeEntryXTraitCondEntry> sTraitNodeEntryXTraitCondStore("TraitNodeEntryXTraitCond.db2", &TraitNodeEntryXTraitCondLoadInfo::Instance);
-DB2Storage<TraitNodeEntryXTraitCostEntry> sTraitNodeEntryXTraitCostStore("TraitNodeEntryXTraitCost.db2", &TraitNodeEntryXTraitCostLoadInfo::Instance);
-DB2Storage<TraitNodeGroupEntry> sTraitNodeGroupStore("TraitNodeGroup.db2", &TraitNodeGroupLoadInfo::Instance);
-DB2Storage<TraitNodeGroupXTraitCondEntry> sTraitNodeGroupXTraitCondStore("TraitNodeGroupXTraitCond.db2", &TraitNodeGroupXTraitCondLoadInfo::Instance);
-DB2Storage<TraitNodeGroupXTraitCostEntry> sTraitNodeGroupXTraitCostStore("TraitNodeGroupXTraitCost.db2", &TraitNodeGroupXTraitCostLoadInfo::Instance);
-DB2Storage<TraitNodeGroupXTraitNodeEntry> sTraitNodeGroupXTraitNodeStore("TraitNodeGroupXTraitNode.db2", &TraitNodeGroupXTraitNodeLoadInfo::Instance);
-DB2Storage<TraitNodeXTraitCondEntry> sTraitNodeXTraitCondStore("TraitNodeXTraitCond.db2", &TraitNodeXTraitCondLoadInfo::Instance);
-DB2Storage<TraitNodeXTraitCostEntry> sTraitNodeXTraitCostStore("TraitNodeXTraitCost.db2", &TraitNodeXTraitCostLoadInfo::Instance);
-DB2Storage<TraitNodeXTraitNodeEntryEntry> sTraitNodeXTraitNodeEntryStore("TraitNodeXTraitNodeEntry.db2", &TraitNodeXTraitNodeEntryLoadInfo::Instance);
-DB2Storage<TraitTreeEntry> sTraitTreeStore("TraitTree.db2", &TraitTreeLoadInfo::Instance);
-DB2Storage<TraitTreeLoadoutEntry> sTraitTreeLoadoutStore("TraitTreeLoadout.db2", &TraitTreeLoadoutLoadInfo::Instance);
-DB2Storage<TraitTreeLoadoutEntryEntry> sTraitTreeLoadoutEntryStore("TraitTreeLoadoutEntry.db2", &TraitTreeLoadoutEntryLoadInfo::Instance);
-DB2Storage<TraitTreeXTraitCostEntry> sTraitTreeXTraitCostStore("TraitTreeXTraitCost.db2", &TraitTreeXTraitCostLoadInfo::Instance);
-DB2Storage<TraitTreeXTraitCurrencyEntry> sTraitTreeXTraitCurrencyStore("TraitTreeXTraitCurrency.db2", &TraitTreeXTraitCurrencyLoadInfo::Instance);
DB2Storage<TransmogHolidayEntry> sTransmogHolidayStore("TransmogHoliday.db2", &TransmogHolidayLoadInfo::Instance);
DB2Storage<TransmogSetEntry> sTransmogSetStore("TransmogSet.db2", &TransmogSetLoadInfo::Instance);
DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore("TransmogSetGroup.db2", &TransmogSetGroupLoadInfo::Instance);
@@ -756,7 +732,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
LOAD_DB2(sServerMessagesStore);
LOAD_DB2(sSkillLineStore);
LOAD_DB2(sSkillLineAbilityStore);
- LOAD_DB2(sSkillLineXTraitTreeStore);
LOAD_DB2(sSkillRaceClassInfoStore);
LOAD_DB2(sSoundKitStore);
LOAD_DB2(sSpellAuraOptionsStore);
@@ -808,29 +783,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
LOAD_DB2(sTaxiPathNodeStore);
LOAD_DB2(sTotemCategoryStore);
LOAD_DB2(sToyStore);
- LOAD_DB2(sTraitCondStore);
- LOAD_DB2(sTraitCostStore);
- LOAD_DB2(sTraitCurrencyStore);
- LOAD_DB2(sTraitCurrencySourceStore);
- LOAD_DB2(sTraitDefinitionStore);
- LOAD_DB2(sTraitDefinitionEffectPointsStore);
- LOAD_DB2(sTraitEdgeStore);
- LOAD_DB2(sTraitNodeStore);
- LOAD_DB2(sTraitNodeEntryStore);
- LOAD_DB2(sTraitNodeEntryXTraitCondStore);
- LOAD_DB2(sTraitNodeEntryXTraitCostStore);
- LOAD_DB2(sTraitNodeGroupStore);
- LOAD_DB2(sTraitNodeGroupXTraitCondStore);
- LOAD_DB2(sTraitNodeGroupXTraitCostStore);
- LOAD_DB2(sTraitNodeGroupXTraitNodeStore);
- LOAD_DB2(sTraitNodeXTraitCondStore);
- LOAD_DB2(sTraitNodeXTraitCostStore);
- LOAD_DB2(sTraitNodeXTraitNodeEntryStore);
- LOAD_DB2(sTraitTreeStore);
- LOAD_DB2(sTraitTreeLoadoutStore);
- LOAD_DB2(sTraitTreeLoadoutEntryStore);
- LOAD_DB2(sTraitTreeXTraitCostStore);
- LOAD_DB2(sTraitTreeXTraitCurrencyStore);
LOAD_DB2(sTransmogHolidayStore);
LOAD_DB2(sTransmogSetStore);
LOAD_DB2(sTransmogSetGroupStore);
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 11d94c30b04..6570913ffdf 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -179,7 +179,6 @@ TC_GAME_API extern DB2Storage<SkillLineEntry> sSkillLineSt
TC_GAME_API extern DB2Storage<SceneScriptPackageEntry> sSceneScriptPackageStore;
TC_GAME_API extern DB2Storage<ServerMessagesEntry> sServerMessagesStore;
TC_GAME_API extern DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore;
-TC_GAME_API extern DB2Storage<SkillLineXTraitTreeEntry> sSkillLineXTraitTreeStore;
TC_GAME_API extern DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore;
TC_GAME_API extern DB2Storage<SoundKitEntry> sSoundKitStore;
TC_GAME_API extern DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore;
@@ -226,29 +225,6 @@ TC_GAME_API extern DB2Storage<TalentTreePrimarySpellsEntry> sTalentTreeP
TC_GAME_API extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore;
TC_GAME_API extern DB2Storage<TaxiPathEntry> sTaxiPathStore;
TC_GAME_API extern DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore;
-TC_GAME_API extern DB2Storage<TraitCondEntry> sTraitCondStore;
-TC_GAME_API extern DB2Storage<TraitCostEntry> sTraitCostStore;
-TC_GAME_API extern DB2Storage<TraitCurrencyEntry> sTraitCurrencyStore;
-TC_GAME_API extern DB2Storage<TraitCurrencySourceEntry> sTraitCurrencySourceStore;
-TC_GAME_API extern DB2Storage<TraitDefinitionEntry> sTraitDefinitionStore;
-TC_GAME_API extern DB2Storage<TraitDefinitionEffectPointsEntry> sTraitDefinitionEffectPointsStore;
-TC_GAME_API extern DB2Storage<TraitEdgeEntry> sTraitEdgeStore;
-TC_GAME_API extern DB2Storage<TraitNodeEntry> sTraitNodeStore;
-TC_GAME_API extern DB2Storage<TraitNodeEntryEntry> sTraitNodeEntryStore;
-TC_GAME_API extern DB2Storage<TraitNodeEntryXTraitCondEntry> sTraitNodeEntryXTraitCondStore;
-TC_GAME_API extern DB2Storage<TraitNodeEntryXTraitCostEntry> sTraitNodeEntryXTraitCostStore;
-TC_GAME_API extern DB2Storage<TraitNodeGroupEntry> sTraitNodeGroupStore;
-TC_GAME_API extern DB2Storage<TraitNodeGroupXTraitCondEntry> sTraitNodeGroupXTraitCondStore;
-TC_GAME_API extern DB2Storage<TraitNodeGroupXTraitCostEntry> sTraitNodeGroupXTraitCostStore;
-TC_GAME_API extern DB2Storage<TraitNodeGroupXTraitNodeEntry> sTraitNodeGroupXTraitNodeStore;
-TC_GAME_API extern DB2Storage<TraitNodeXTraitCondEntry> sTraitNodeXTraitCondStore;
-TC_GAME_API extern DB2Storage<TraitNodeXTraitCostEntry> sTraitNodeXTraitCostStore;
-TC_GAME_API extern DB2Storage<TraitNodeXTraitNodeEntryEntry> sTraitNodeXTraitNodeEntryStore;
-TC_GAME_API extern DB2Storage<TraitTreeEntry> sTraitTreeStore;
-TC_GAME_API extern DB2Storage<TraitTreeLoadoutEntry> sTraitTreeLoadoutStore;
-TC_GAME_API extern DB2Storage<TraitTreeLoadoutEntryEntry> sTraitTreeLoadoutEntryStore;
-TC_GAME_API extern DB2Storage<TraitTreeXTraitCostEntry> sTraitTreeXTraitCostStore;
-TC_GAME_API extern DB2Storage<TraitTreeXTraitCurrencyEntry> sTraitTreeXTraitCurrencyStore;
TC_GAME_API extern DB2Storage<TransmogHolidayEntry> sTransmogHolidayStore;
TC_GAME_API extern DB2Storage<TransmogSetEntry> sTransmogSetStore;
TC_GAME_API extern DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 24d9b103270..f6f1df07abd 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -2787,14 +2787,6 @@ struct SkillLineAbilityEntry
EnumFlag<SkillLineAbilityFlags> GetFlags() const { return static_cast<SkillLineAbilityFlags>(Flags); }
};
-struct SkillLineXTraitTreeEntry
-{
- uint32 ID;
- uint32 SkillLineID;
- int32 TraitTreeID;
- int32 OrderIndex;
-};
-
struct SkillRaceClassInfoEntry
{
uint32 ID;
@@ -3471,224 +3463,6 @@ struct TransmogHolidayEntry
int32 RequiredTransmogHoliday;
};
-struct TraitCondEntry
-{
- uint32 ID;
- int32 CondType;
- uint32 TraitTreeID;
- int32 GrantedRanks;
- int32 QuestID;
- int32 AchievementID;
- int32 SpecSetID;
- int32 TraitNodeGroupID;
- int32 TraitNodeID;
- int32 TraitCurrencyID;
- int32 SpentAmountRequired;
- int32 Flags;
- int32 RequiredLevel;
- int32 FreeSharedStringID;
- int32 SpendMoreSharedStringID;
-
- TraitConditionType GetCondType() const { return static_cast<TraitConditionType>(CondType); }
-};
-
-struct TraitCostEntry
-{
- char const* InternalName;
- uint32 ID;
- int32 Amount;
- int32 TraitCurrencyID;
-};
-
-struct TraitCurrencyEntry
-{
- uint32 ID;
- int32 Type;
- int32 CurrencyTypesID;
- int32 Flags;
- int32 Icon;
-
- TraitCurrencyType GetType() const { return static_cast<TraitCurrencyType>(Type); }
-};
-
-struct TraitCurrencySourceEntry
-{
- LocalizedString Requirement;
- uint32 ID;
- uint32 TraitCurrencyID;
- int32 Amount;
- int32 QuestID;
- int32 AchievementID;
- int32 PlayerLevel;
- int32 TraitNodeEntryID;
- int32 OrderIndex;
-};
-
-struct TraitDefinitionEntry
-{
- LocalizedString OverrideName;
- LocalizedString OverrideSubtext;
- LocalizedString OverrideDescription;
- uint32 ID;
- int32 SpellID;
- int32 OverrideIcon;
- int32 OverridesSpellID;
- int32 VisibleSpellID;
-};
-
-struct TraitDefinitionEffectPointsEntry
-{
- uint32 ID;
- uint32 TraitDefinitionID;
- int32 EffectIndex;
- int32 OperationType;
- int32 CurveID;
-
- TraitPointsOperationType GetOperationType() const { return static_cast<TraitPointsOperationType>(OperationType); }
-};
-
-struct TraitEdgeEntry
-{
- uint32 ID;
- int32 VisualStyle;
- uint32 LeftTraitNodeID;
- int32 RightTraitNodeID;
- int32 Type;
-};
-
-struct TraitNodeEntry
-{
- uint32 ID;
- uint32 TraitTreeID;
- int32 PosX;
- int32 PosY;
- uint8 Type;
- int32 Flags;
-
- TraitNodeType GetType() const { return static_cast<TraitNodeType>(Type); }
-};
-
-struct TraitNodeEntryEntry
-{
- uint32 ID;
- int32 TraitDefinitionID;
- int32 MaxRanks;
- uint8 NodeEntryType;
-
- TraitNodeEntryType GetNodeEntryType() const { return static_cast<TraitNodeEntryType>(NodeEntryType); }
-};
-
-struct TraitNodeEntryXTraitCondEntry
-{
- uint32 ID;
- int32 TraitCondID;
- uint32 TraitNodeEntryID;
-};
-
-struct TraitNodeEntryXTraitCostEntry
-{
- uint32 ID;
- uint32 TraitNodeEntryID;
- int32 TraitCostID;
-};
-
-struct TraitNodeGroupEntry
-{
- uint32 ID;
- uint32 TraitTreeID;
- int32 Flags;
-};
-
-struct TraitNodeGroupXTraitCondEntry
-{
- uint32 ID;
- int32 TraitCondID;
- uint32 TraitNodeGroupID;
-};
-
-struct TraitNodeGroupXTraitCostEntry
-{
- uint32 ID;
- uint32 TraitNodeGroupID;
- int32 TraitCostID;
-};
-
-struct TraitNodeGroupXTraitNodeEntry
-{
- uint32 ID;
- uint32 TraitNodeGroupID;
- int32 TraitNodeID;
- int32 Index;
-};
-
-struct TraitNodeXTraitCondEntry
-{
- uint32 ID;
- int32 TraitCondID;
- uint32 TraitNodeID;
-};
-
-struct TraitNodeXTraitCostEntry
-{
- uint32 ID;
- uint32 TraitNodeID;
- int32 TraitCostID;
-};
-
-struct TraitNodeXTraitNodeEntryEntry
-{
- uint32 ID;
- uint32 TraitNodeID;
- int32 TraitNodeEntryID;
- int32 Index;
-};
-
-struct TraitTreeEntry
-{
- uint32 ID;
- uint32 TraitSystemID;
- int32 TraitTreeID;
- int32 FirstTraitNodeID;
- int32 PlayerConditionID;
- int32 Flags;
- float Unused1000_2;
- float Unused1000_3;
-
- EnumFlag<TraitTreeFlag> GetFlags() const { return static_cast<TraitTreeFlag>(Flags); }
-};
-
-struct TraitTreeLoadoutEntry
-{
- uint32 ID;
- uint32 TraitTreeID;
- int32 ChrSpecializationID;
-};
-
-struct TraitTreeLoadoutEntryEntry
-{
- uint32 ID;
- uint32 TraitTreeLoadoutID;
- int32 SelectedTraitNodeID;
- int32 SelectedTraitNodeEntryID;
- int32 NumPoints;
- int32 OrderIndex;
-};
-
-struct TraitTreeXTraitCostEntry
-{
- uint32 ID;
- uint32 TraitTreeID;
- int32 TraitCostID;
-};
-
-struct TraitTreeXTraitCurrencyEntry
-{
- uint32 ID;
- int32 Index;
- uint32 TraitTreeID;
- int32 TraitCurrencyID;
-};
-
struct TransmogSetEntry
{
LocalizedString Name;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 5abf2243445..37ce7228a1b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -121,8 +121,6 @@
#include "TerrainMgr.h"
#include "ToyPackets.h"
#include "TradeData.h"
-#include "TraitMgr.h"
-#include "TraitPacketsCommon.h"
#include "Transport.h"
#include "UpdateData.h"
#include "Util.h"
@@ -2473,7 +2471,7 @@ WorldLocation const* Player::GetStoredAuraTeleportLocation(uint32 spellId) const
return nullptr;
}
-bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading /*= false*/, int32 fromSkill /*= 0*/, bool favorite /*= false*/, Optional<int32> traitDefinitionId /*= {}*/)
+bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading /*= false*/, int32 fromSkill /*= 0*/, bool favorite /*= false*/)
{
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE);
if (!spellInfo)
@@ -2553,15 +2551,6 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
dependent_set = true;
}
- if (itr->second.TraitDefinitionId != traitDefinitionId)
- {
- if (itr->second.TraitDefinitionId)
- if (TraitDefinitionEntry const* traitDefinition = sTraitDefinitionStore.LookupEntry(*itr->second.TraitDefinitionId))
- RemoveOverrideSpell(traitDefinition->OverridesSpellID, spellId);
-
- itr->second.TraitDefinitionId = traitDefinitionId;
- }
-
itr->second.favorite = favorite;
// update active state for known spell
@@ -2646,8 +2635,6 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
newspell.dependent = dependent;
newspell.disabled = disabled;
newspell.favorite = favorite;
- if (traitDefinitionId)
- newspell.TraitDefinitionId = *traitDefinitionId;
// replace spells in action bars and spellbook to bigger rank if only one spell rank must be accessible
if (newspell.active && !newspell.disabled && spellInfo->IsRanked())
@@ -2716,47 +2703,11 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
CastSpellExtraArgs args;
args.SetTriggerFlags(TRIGGERED_FULL_MASK);
- if (traitDefinitionId)
- {
- if (UF::TraitConfig const* traitConfig = GetTraitConfig(m_activePlayerData->ActiveCombatTraitConfigID))
- {
- int32 traitEntryIndex = traitConfig->Entries.FindIndexIf([traitDefinitionId](UF::TraitEntry const& traitEntry)
- {
- return sTraitNodeEntryStore.AssertEntry(traitEntry.TraitNodeEntryID)->TraitDefinitionID == traitDefinitionId;
- });
- int32 rank = 0;
- if (traitEntryIndex >= 0)
- rank = traitConfig->Entries[traitEntryIndex].Rank + traitConfig->Entries[traitEntryIndex].GrantedRanks;
-
- if (rank > 0)
- {
- if (std::vector<TraitDefinitionEffectPointsEntry const*> const* traitDefinitionEffectPoints = TraitMgr::GetTraitDefinitionEffectPointModifiers(*traitDefinitionId))
- {
- for (TraitDefinitionEffectPointsEntry const* traitDefinitionEffectPoint : *traitDefinitionEffectPoints)
- {
- if (traitDefinitionEffectPoint->EffectIndex >= int32(spellInfo->GetEffects().size()))
- continue;
-
- float basePoints = sDB2Manager.GetCurveValueAt(traitDefinitionEffectPoint->CurveID, rank);
- if (traitDefinitionEffectPoint->GetOperationType() == TraitPointsOperationType::Multiply)
- basePoints *= spellInfo->GetEffect(SpellEffIndex(traitDefinitionEffectPoint->EffectIndex)).CalcBaseValue(this, nullptr);
-
- args.AddSpellMod(SpellValueMod(SPELLVALUE_BASE_POINT0 + traitDefinitionEffectPoint->EffectIndex), basePoints);
- }
- }
- }
- }
- }
-
CastSpell(this, spellId, args);
if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
return false;
}
- if (traitDefinitionId)
- if (TraitDefinitionEntry const* traitDefinition = sTraitDefinitionStore.LookupEntry(*traitDefinitionId))
- AddOverrideSpell(traitDefinition->OverridesSpellID, spellId);
-
// update free primary prof.points (if any, can be none in case GM .learn prof. learning)
if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
{
@@ -2924,7 +2875,7 @@ bool Player::HandlePassiveSpellLearn(SpellInfo const* spellInfo)
return need_cast && (!spellInfo->CasterAuraState || HasAuraState(AuraStateType(spellInfo->CasterAuraState)));
}
-void Player::LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill /*= 0*/, bool suppressMessaging /*= false*/, Optional<int32> traitDefinitionId /*= {}*/)
+void Player::LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill /*= 0*/, bool suppressMessaging /*= false*/)
{
PlayerSpellMap::iterator itr = m_spells.find(spell_id);
@@ -2932,7 +2883,7 @@ void Player::LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill /*= 0*/
bool active = disabled ? itr->second.active : true;
bool favorite = itr != m_spells.end() ? itr->second.favorite : false;
- bool learning = AddSpell(spell_id, active, true, dependent, false, false, fromSkill, favorite, traitDefinitionId);
+ bool learning = AddSpell(spell_id, active, true, dependent, false, false, fromSkill, favorite);
// prevent duplicated entires in spell book, also not send if not in world (loading)
if (learning && IsInWorld())
@@ -2941,7 +2892,6 @@ void Player::LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill /*= 0*/
WorldPackets::Spells::LearnedSpellInfo& learnedSpellInfo = learnedSpells.ClientLearnedSpellData.emplace_back();
learnedSpellInfo.SpellID = spell_id;
learnedSpellInfo.IsFavorite = favorite;
- learnedSpellInfo.TraitDefinitionID = traitDefinitionId;
learnedSpells.SuppressMessaging = suppressMessaging;
SendDirectMessage(learnedSpells.Write());
}
@@ -2996,7 +2946,6 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled /*= false*/, bool learn_
bool cur_active = itr->second.active;
bool cur_dependent = itr->second.dependent;
- Optional<int32> traitDefinitionId = itr->second.TraitDefinitionId;
if (disabled)
{
@@ -3154,10 +3103,6 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled /*= false*/, bool learn_
}
}
- if (traitDefinitionId)
- if (TraitDefinitionEntry const* traitDefinition = sTraitDefinitionStore.LookupEntry(*traitDefinitionId))
- RemoveOverrideSpell(traitDefinition->OverridesSpellID, spell_id);
-
m_overrideSpells.erase(spell_id);
if (m_canTitanGrip)
@@ -3931,14 +3876,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
Corpse::DeleteFromDB(playerguid, trans);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES_BY_CHAR);
- stmt->setUInt64(0, guid);
- trans->Append(stmt);
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS_BY_CHAR);
- stmt->setUInt64(0, guid);
- trans->Append(stmt);
-
sCharacterCache->DeleteCharacterCacheEntry(playerguid, name);
break;
}
@@ -17326,9 +17263,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
LearnDefaultSkills();
LearnCustomSpells();
- _LoadTraits(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TRAIT_CONFIGS),
- holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TRAIT_ENTRIES)); // must be after loading spells
-
// must be before inventory (some items required reputation check)
m_reputationMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_REPUTATION));
@@ -19240,7 +19174,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
_SaveMonthlyQuestStatus(trans);
_SaveGlyphs(trans);
_SaveTalents(trans);
- _SaveTraits(trans);
_SaveSpells(trans);
GetSpellHistory()->SaveToDB<Player>(trans);
_SaveActions(trans);
@@ -19339,26 +19272,6 @@ void Player::_SaveCustomizations(CharacterDatabaseTransaction trans)
void Player::_SaveActions(CharacterDatabaseTransaction trans)
{
- int32 traitConfigId = [&]() -> int32
- {
- UF::TraitConfig const* traitConfig = GetTraitConfig(m_activePlayerData->ActiveCombatTraitConfigID);
- if (!traitConfig)
- return 0;
-
- int32 usedSavedTraitConfigIndex = m_activePlayerData->TraitConfigs.FindIndexIf([localIdent = *traitConfig->LocalIdentifier](UF::TraitConfig const& savedConfig)
- {
- return static_cast<TraitConfigType>(*savedConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None
- && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::SharedActionBars) == TraitCombatConfigFlags::None
- && savedConfig.LocalIdentifier == localIdent;
- });
-
- if (usedSavedTraitConfigIndex >= 0)
- return m_activePlayerData->TraitConfigs[usedSavedTraitConfigIndex].ID;
-
- return 0;
- }();
-
CharacterDatabasePreparedStatement* stmt;
for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
@@ -19369,7 +19282,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
stmt->setUInt64(0, GetGUID().GetCounter());
stmt->setUInt8(1, GetActiveTalentGroup());
- stmt->setInt32(2, traitConfigId);
+ stmt->setInt32(2, 0);
stmt->setUInt8(3, itr->first);
stmt->setUInt32(4, itr->second.GetAction());
stmt->setUInt8(5, uint8(itr->second.GetType()));
@@ -19385,7 +19298,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
stmt->setUInt64(2, GetGUID().GetCounter());
stmt->setUInt8(3, itr->first);
stmt->setUInt8(4, GetActiveTalentGroup());
- stmt->setInt32(5, traitConfigId);
+ stmt->setInt32(5, 0);
trans->Append(stmt);
itr->second.uState = ACTIONBUTTON_UNCHANGED;
@@ -19396,7 +19309,7 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)
stmt->setUInt64(0, GetGUID().GetCounter());
stmt->setUInt8(1, itr->first);
stmt->setUInt8(2, GetActiveTalentGroup());
- stmt->setInt32(3, traitConfigId);
+ stmt->setInt32(3, 0);
trans->Append(stmt);
m_actionButtons.erase(itr++);
@@ -26437,148 +26350,6 @@ void Player::_LoadTalents(PreparedQueryResult talentGroupResult, PreparedQueryRe
}
}
-void Player::_LoadTraits(PreparedQueryResult /*configsResult*/, PreparedQueryResult /*entriesResult*/)
-{
- /*
- std::unordered_multimap<int32, WorldPackets::Traits::TraitEntry> traitEntriesByConfig;
- if (entriesResult)
- {
- // 0 1, 2 3 4
- // SELECT traitConfigId, traitNodeId, traitNodeEntryId, rank, grantedRanks FROM character_trait_entry WHERE guid = ?
- do
- {
- Field* fields = entriesResult->Fetch();
- WorldPackets::Traits::TraitEntry traitEntry;
- traitEntry.TraitNodeID = fields[1].GetInt32();
- traitEntry.TraitNodeEntryID = fields[2].GetInt32();
- traitEntry.Rank = fields[3].GetInt32();
- traitEntry.GrantedRanks = fields[4].GetInt32();
-
- if (!TraitMgr::IsValidEntry(traitEntry))
- continue;
-
- traitEntriesByConfig.emplace(fields[0].GetInt32(), traitEntry);
-
- } while (entriesResult->NextRow());
- }
-
- if (configsResult)
- {
- // 0 1 2 3 4 5 6 7
- // SELECT traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, `name` FROM character_trait_config WHERE guid = ?
- do
- {
- Field* fields = configsResult->Fetch();
- WorldPackets::Traits::TraitConfig traitConfig;
- traitConfig.ID = fields[0].GetInt32();
- traitConfig.Type = static_cast<TraitConfigType>(fields[1].GetInt32());
- switch (traitConfig.Type)
- {
- case TraitConfigType::Combat:
- traitConfig.ChrSpecializationID = fields[2].GetInt32();
- traitConfig.CombatConfigFlags = static_cast<TraitCombatConfigFlags>(fields[3].GetInt32());
- traitConfig.LocalIdentifier = fields[4].GetInt32();
- break;
- case TraitConfigType::Profession:
- traitConfig.SkillLineID = fields[5].GetInt32();
- break;
- case TraitConfigType::Generic:
- traitConfig.TraitSystemID = fields[6].GetInt32();
- break;
- default:
- break;
- }
-
- traitConfig.Name = fields[7].GetString();
-
- for (auto&& [_, traitEntry] : Trinity::Containers::MapEqualRange(traitEntriesByConfig, traitConfig.ID))
- traitConfig.Entries.emplace_back() = traitEntry;
-
- if (TraitMgr::ValidateConfig(traitConfig, this) != TraitMgr::LearnResult::Ok)
- {
- traitConfig.Entries.clear();
- for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(traitConfig, this))
- traitConfig.Entries.emplace_back(grantedEntry);
- }
-
- AddTraitConfig(traitConfig);
-
- } while (configsResult->NextRow());
- }
-
- auto hasConfigForSpec = [&](int32 specId)
- {
- return m_activePlayerData->TraitConfigs.FindIndexIf([=](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.Type == AsUnderlyingType(TraitConfigType::Combat)
- && traitConfig.ChrSpecializationID == specId
- && traitConfig.CombatConfigFlags & AsUnderlyingType(TraitCombatConfigFlags::ActiveForSpec);
- }) >= 0;
- };
-
- auto findFreeLocalIdentifier = [&](int32 specId)
- {
- int32 index = 1;
- while (m_activePlayerData->TraitConfigs.FindIndexIf([specId, index](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.Type == AsUnderlyingType(TraitConfigType::Combat)
- && traitConfig.ChrSpecializationID == specId
- && traitConfig.LocalIdentifier == index;
- }) >= 0)
- ++index;
-
- return index;
- };
-
- for (uint32 i = 0; i < MAX_SPECIALIZATIONS - 1; ++i)
- {
- if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(GetClass(), i))
- {
- if (hasConfigForSpec(spec->ID))
- continue;
-
- WorldPackets::Traits::TraitConfig traitConfig;
- traitConfig.Type = TraitConfigType::Combat;
- traitConfig.ChrSpecializationID = spec->ID;
- traitConfig.CombatConfigFlags = TraitCombatConfigFlags::ActiveForSpec;
- traitConfig.LocalIdentifier = findFreeLocalIdentifier(spec->ID);
- traitConfig.Name = spec->Name[GetSession()->GetSessionDbcLocale()];
-
- CreateTraitConfig(traitConfig);
- }
- }
-
- int32 activeConfig = m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.Type == AsUnderlyingType(TraitConfigType::Combat)
- && traitConfig.ChrSpecializationID == int32(GetPrimarySpecialization())
- && traitConfig.CombatConfigFlags & AsUnderlyingType(TraitCombatConfigFlags::ActiveForSpec);
- });
-
- if (activeConfig >= 0)
- SetActiveCombatTraitConfigID(m_activePlayerData->TraitConfigs[activeConfig].ID);
-
- for (UF::TraitConfig const& traitConfig : m_activePlayerData->TraitConfigs)
- {
- switch (static_cast<TraitConfigType>(*traitConfig.Type))
- {
- case TraitConfigType::Combat:
- if (traitConfig.ID != int32(*m_activePlayerData->ActiveCombatTraitConfigID))
- continue;
- break;
- case TraitConfigType::Profession:
- if (!HasSkill(traitConfig.SkillLineID))
- continue;
- break;
- default:
- break;
- }
-
- ApplyTraitConfig(traitConfig.ID, true);
- }
- */
-}
-
void Player::_SaveTalents(CharacterDatabaseTransaction trans)
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
@@ -26612,124 +26383,13 @@ void Player::_SaveTalents(CharacterDatabaseTransaction trans)
}
}
-void Player::_SaveTraits(CharacterDatabaseTransaction trans)
-{
- CharacterDatabasePreparedStatement* stmt = nullptr;
- for (auto& [traitConfigId, state] : m_traitConfigStates)
- {
- switch (state)
- {
- case PLAYERSPELL_CHANGED:
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfigId);
- trans->Append(stmt);
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfigId);
- trans->Append(stmt);
-
- if (UF::TraitConfig const* traitConfig = GetTraitConfig(traitConfigId))
- {
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TRAIT_CONFIGS);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfig->ID);
- stmt->setInt32(2, traitConfig->Type);
- switch (static_cast<TraitConfigType>(*traitConfig->Type))
- {
- case TraitConfigType::Combat:
- stmt->setInt32(3, traitConfig->ChrSpecializationID);
- stmt->setInt32(4, traitConfig->CombatConfigFlags);
- stmt->setInt32(5, traitConfig->LocalIdentifier);
- stmt->setNull(6);
- stmt->setNull(7);
- break;
- case TraitConfigType::Profession:
- stmt->setNull(3);
- stmt->setNull(4);
- stmt->setNull(5);
- stmt->setInt32(6, traitConfig->SkillLineID);
- stmt->setNull(7);
- break;
- case TraitConfigType::Generic:
- stmt->setNull(3);
- stmt->setNull(4);
- stmt->setNull(5);
- stmt->setNull(6);
- stmt->setInt32(7, traitConfig->TraitSystemID);
- break;
- default:
- break;
- }
-
- stmt->setString(8, traitConfig->Name);
- trans->Append(stmt);
-
- for (UF::TraitEntry const& traitEntry : traitConfig->Entries)
- {
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TRAIT_ENTRIES);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfig->ID);
- stmt->setInt32(2, traitEntry.TraitNodeID);
- stmt->setInt32(3, traitEntry.TraitNodeEntryID);
- stmt->setInt32(4, traitEntry.Rank);
- stmt->setInt32(5, traitEntry.GrantedRanks);
- trans->Append(stmt);
- }
- }
- break;
- case PLAYERSPELL_REMOVED:
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfigId);
- trans->Append(stmt);
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfigId);
- trans->Append(stmt);
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_TRAIT_CONFIG);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfigId);
- trans->Append(stmt);
- break;
- default:
- break;
- }
- }
-
- m_traitConfigStates.clear();
-}
-
void Player::StartLoadingActionButtons(std::function<void()>&& callback /*= nullptr*/)
{
- int32 traitConfigId = [&]() -> int32
- {
- UF::TraitConfig const* traitConfig = GetTraitConfig(m_activePlayerData->ActiveCombatTraitConfigID);
- if (!traitConfig)
- return 0;
-
- int32 usedSavedTraitConfigIndex = m_activePlayerData->TraitConfigs.FindIndexIf([localIdent = *traitConfig->LocalIdentifier](UF::TraitConfig const& savedConfig)
- {
- return static_cast<TraitConfigType>(*savedConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None
- && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::SharedActionBars) == TraitCombatConfigFlags::None
- && savedConfig.LocalIdentifier == localIdent;
- });
-
- if (usedSavedTraitConfigIndex >= 0)
- return m_activePlayerData->TraitConfigs[usedSavedTraitConfigIndex].ID;
-
- return 0;
- }();
-
// load them asynchronously
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_ACTIONS_SPEC);
stmt->setUInt64(0, GetGUID().GetCounter());
stmt->setUInt8(1, GetActiveTalentGroup());
- stmt->setInt32(2, traitConfigId);
+ stmt->setInt32(2, 0);
WorldSession* mySess = GetSession();
mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
@@ -26754,368 +26414,6 @@ void Player::LoadActions(PreparedQueryResult result)
SendActionButtons(1);
}
-void Player::CreateTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig)
-{
- uint32 configId = TraitMgr::GenerateNewTraitConfigId();
- auto hasConfigId = [&](int32 id)
- {
- return m_activePlayerData->TraitConfigs.FindIndexIf([id](UF::TraitConfig const& config) { return config.ID == id; }) >= 0;
- };
-
- while (hasConfigId(configId))
- configId = TraitMgr::GenerateNewTraitConfigId();
-
- traitConfig.ID = configId;
-
- int32 traitConfigIndex = m_activePlayerData->TraitConfigs.size();
- AddTraitConfig(traitConfig);
-
- for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(traitConfig, this))
- {
- auto entryItr = std::find_if(traitConfig.Entries.begin(), traitConfig.Entries.end(),
- [&](WorldPackets::Traits::TraitEntry const& entry) { return entry.TraitNodeID == grantedEntry.TraitNodeID && entry.TraitNodeEntryID == grantedEntry.TraitNodeEntryID; });
-
- if (entryItr == traitConfig.Entries.end())
- AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfigIndex)
- .ModifyValue(&UF::TraitConfig::Entries)) = grantedEntry;
- }
-
- m_traitConfigStates[configId] = PLAYERSPELL_CHANGED;
-}
-
-void Player::AddTraitConfig(WorldPackets::Traits::TraitConfig const& traitConfig)
-{
- auto setter = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TraitConfigs));
- setter.ModifyValue(&UF::TraitConfig::ID).SetValue(traitConfig.ID);
- setter.ModifyValue(&UF::TraitConfig::Name).SetValue(traitConfig.Name);
- setter.ModifyValue(&UF::TraitConfig::Type).SetValue(AsUnderlyingType(traitConfig.Type));
- setter.ModifyValue(&UF::TraitConfig::SkillLineID).SetValue(traitConfig.SkillLineID);;
- setter.ModifyValue(&UF::TraitConfig::ChrSpecializationID).SetValue(traitConfig.ChrSpecializationID);
- setter.ModifyValue(&UF::TraitConfig::CombatConfigFlags).SetValue(AsUnderlyingType(traitConfig.CombatConfigFlags));
- setter.ModifyValue(&UF::TraitConfig::LocalIdentifier).SetValue(traitConfig.LocalIdentifier);
- setter.ModifyValue(&UF::TraitConfig::TraitSystemID).SetValue(traitConfig.TraitSystemID);
-
- for (WorldPackets::Traits::TraitEntry const& traitEntry : traitConfig.Entries)
- {
- UF::TraitEntry& newEntry = AddDynamicUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::Entries));
- newEntry.TraitNodeID = traitEntry.TraitNodeID;
- newEntry.TraitNodeEntryID = traitEntry.TraitNodeEntryID;
- newEntry.Rank = traitEntry.Rank;
- newEntry.GrantedRanks = traitEntry.GrantedRanks;
- }
-}
-
-UF::TraitConfig const* Player::GetTraitConfig(int32 configId) const
-{
- int32 index = m_activePlayerData->TraitConfigs.FindIndexIf([configId](UF::TraitConfig const& config) { return config.ID == configId; });
- if (index < 0)
- return nullptr;
-
- return &m_activePlayerData->TraitConfigs[index];
-}
-
-void Player::UpdateTraitConfig(WorldPackets::Traits::TraitConfig&& newConfig, int32 savedConfigId, bool withCastTime)
-{
- int32 index = m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& config) { return config.ID == newConfig.ID; });
- if (index < 0)
- return;
-
- if (withCastTime)
- {
- CastSpell(this, TraitMgr::COMMIT_COMBAT_TRAIT_CONFIG_CHANGES_SPELL_ID, CastSpellExtraArgs(SPELLVALUE_BASE_POINT0, savedConfigId).SetCustomArg(std::move(newConfig)));
- return;
- }
-
- bool isActiveConfig = true;
- bool loadActionButtons = false;
- switch (TraitConfigType(*m_activePlayerData->TraitConfigs[index].Type))
- {
- case TraitConfigType::Combat:
- isActiveConfig = newConfig.ID == int32(*m_activePlayerData->ActiveCombatTraitConfigID);
- loadActionButtons = m_activePlayerData->TraitConfigs[index].LocalIdentifier != newConfig.LocalIdentifier;
- break;
- case TraitConfigType::Profession:
- isActiveConfig = HasSkill(m_activePlayerData->TraitConfigs[index].SkillLineID);
- break;
- default:
- break;
- }
-
- std::function<void()> finalizeTraitConfigUpdate = [=, this, newConfig = std::move(newConfig)]()
- {
- SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, index)
- .ModifyValue(&UF::TraitConfig::LocalIdentifier), newConfig.LocalIdentifier);
-
- ApplyTraitEntryChanges(newConfig.ID, newConfig, isActiveConfig, true);
-
- if (savedConfigId)
- ApplyTraitEntryChanges(savedConfigId, newConfig, false, false);
-
- if (EnumFlag(newConfig.CombatConfigFlags).HasFlag(TraitCombatConfigFlags::StarterBuild))
- SetTraitConfigUseStarterBuild(newConfig.ID, true);
- };
-
- if (loadActionButtons)
- {
- CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- _SaveActions(trans);
- CharacterDatabase.CommitTransaction(trans);
-
- StartLoadingActionButtons(std::move(finalizeTraitConfigUpdate));
- }
- else
- finalizeTraitConfigUpdate();
-}
-
-void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::TraitConfig const& newConfig, bool applyTraits, bool consumeCurrencies)
-{
- int32 editedIndex = m_activePlayerData->TraitConfigs.FindIndexIf([editedConfigId](UF::TraitConfig const& config) { return config.ID == editedConfigId; });
- if (editedIndex < 0)
- return;
-
- auto makeTraitEntryFinder = [](int32 traitNodeId, int32 traitNodeEntryId)
- {
- return [=](auto const& ufEntry) { return ufEntry.TraitNodeID == traitNodeId && ufEntry.TraitNodeEntryID == traitNodeEntryId; };
- };
-
- UF::TraitConfig const& editedConfig = m_activePlayerData->TraitConfigs[editedIndex];
-
- // remove traits not found in new config
- std::set<int32, std::greater<>> entryIndicesToRemove;
- for (int32 i = 0; i < int32(editedConfig.Entries.size()); ++i)
- {
- UF::TraitEntry const& oldEntry = editedConfig.Entries[i];
- auto entryItr = std::find_if(newConfig.Entries.begin(), newConfig.Entries.end(), makeTraitEntryFinder(oldEntry.TraitNodeID, oldEntry.TraitNodeEntryID));
- if (entryItr != newConfig.Entries.end())
- continue;
-
- if (applyTraits)
- ApplyTraitEntry(oldEntry.TraitNodeEntryID, 0, 0, false);
-
- entryIndicesToRemove.insert(i);
- }
-
- for (int32 indexToRemove : entryIndicesToRemove)
- {
- RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex)
- .ModifyValue(&UF::TraitConfig::Entries), indexToRemove);
- }
-
- std::vector<WorldPackets::Traits::TraitEntry> costEntries;
-
- // apply new traits
- for (std::size_t i = 0; i < newConfig.Entries.size(); ++i)
- {
- WorldPackets::Traits::TraitEntry const& newEntry = newConfig.Entries[i];
- int32 oldEntryIndex = editedConfig.Entries.FindIndexIf(makeTraitEntryFinder(newEntry.TraitNodeID, newEntry.TraitNodeEntryID));
- if (oldEntryIndex < 0)
- {
- if (consumeCurrencies)
- costEntries.push_back(newEntry);
-
- UF::TraitEntry& newUfEntry = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex)
- .ModifyValue(&UF::TraitConfig::Entries));
- newUfEntry.TraitNodeID = newEntry.TraitNodeID;
- newUfEntry.TraitNodeEntryID = newEntry.TraitNodeEntryID;
- newUfEntry.Rank = newEntry.Rank;
- newUfEntry.GrantedRanks = newEntry.GrantedRanks;
-
- if (applyTraits)
- ApplyTraitEntry(newUfEntry.TraitNodeEntryID, newUfEntry.Rank, 0, true);
- }
- else if (newEntry.Rank != editedConfig.Entries[oldEntryIndex].Rank || newEntry.GrantedRanks != editedConfig.Entries[oldEntryIndex].GrantedRanks)
- {
- if (consumeCurrencies && newEntry.Rank > editedConfig.Entries[oldEntryIndex].Rank)
- {
- WorldPackets::Traits::TraitEntry& costEntry = costEntries.emplace_back(newEntry);
- costEntry.Rank -= editedConfig.Entries[oldEntryIndex].Rank;
- }
-
- SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex)
- .ModifyValue(&UF::TraitConfig::Entries, oldEntryIndex)
- .ModifyValue(&UF::TraitEntry::Rank), newEntry.Rank);
-
- SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex)
- .ModifyValue(&UF::TraitConfig::Entries, oldEntryIndex)
- .ModifyValue(&UF::TraitEntry::GrantedRanks), newEntry.GrantedRanks);
-
- if (applyTraits)
- ApplyTraitEntry(newEntry.TraitNodeEntryID, newEntry.Rank, newEntry.GrantedRanks, true);
- }
- }
-
- if (consumeCurrencies)
- {
- std::map<int32, int32> currencies;
- for (WorldPackets::Traits::TraitEntry const& costEntry : costEntries)
- TraitMgr::FillSpentCurrenciesMap(costEntry, currencies);
-
- for (auto [traitCurrencyId, amount] : currencies)
- {
- TraitCurrencyEntry const* traitCurrency = sTraitCurrencyStore.LookupEntry(traitCurrencyId);
- if (!traitCurrency)
- continue;
-
- switch (traitCurrency->GetType())
- {
- case TraitCurrencyType::Gold:
- ModifyMoney(-amount);
- break;
- case TraitCurrencyType::CurrencyTypesBased:
- RemoveCurrency(traitCurrency->CurrencyTypesID, amount /* TODO: CurrencyDestroyReason */);
- break;
- default:
- break;
- }
- }
- }
-
- m_traitConfigStates[editedConfigId] = PLAYERSPELL_CHANGED;
-}
-
-void Player::RenameTraitConfig(int32 editedConfigId, std::string&& newName)
-{
- int32 editedIndex = m_activePlayerData->TraitConfigs.FindIndexIf([editedConfigId](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.ID == editedConfigId
- && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None;
- });
- if (editedIndex < 0)
- return;
-
- SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex)
- .ModifyValue(&UF::TraitConfig::Name), std::move(newName));
-
- m_traitConfigStates[editedConfigId] = PLAYERSPELL_CHANGED;
-}
-
-void Player::DeleteTraitConfig(int32 deletedConfigId)
-{
- int32 deletedIndex = m_activePlayerData->TraitConfigs.FindIndexIf([deletedConfigId](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.ID == deletedConfigId
- && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None;
- });
- if (deletedIndex < 0)
- return;
-
- RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs), deletedIndex);
-
- m_traitConfigStates[deletedConfigId] = PLAYERSPELL_REMOVED;
-}
-
-void Player::ApplyTraitConfig(int32 configId, bool apply)
-{
- UF::TraitConfig const* traitConfig = GetTraitConfig(configId);
- if (!traitConfig)
- return;
-
- for (UF::TraitEntry const& traitEntry : traitConfig->Entries)
- ApplyTraitEntry(traitEntry.TraitNodeEntryID, traitEntry.Rank, traitEntry.GrantedRanks, apply);
-}
-
-void Player::ApplyTraitEntry(int32 traitNodeEntryId, int32 /*rank*/, int32 /*grantedRanks*/, bool apply)
-{
- TraitNodeEntryEntry const* traitNodeEntry = sTraitNodeEntryStore.LookupEntry(traitNodeEntryId);
- if (!traitNodeEntry)
- return;
-
- TraitDefinitionEntry const* traitDefinition = sTraitDefinitionStore.LookupEntry(traitNodeEntry->TraitDefinitionID);
- if (!traitDefinition)
- return;
-
- if (traitDefinition->SpellID)
- {
- if (apply)
- LearnSpell(traitDefinition->SpellID, true, 0, false, traitNodeEntry->TraitDefinitionID);
- else
- RemoveSpell(traitDefinition->SpellID);
- }
-}
-
-void Player::SetTraitConfigUseStarterBuild(int32 traitConfigId, bool useStarterBuild)
-{
- int32 configIndex = m_activePlayerData->TraitConfigs.FindIndexIf([traitConfigId](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.ID == traitConfigId
- && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None;
- });
- if (configIndex < 0)
- return;
-
- bool currentlyUsesStarterBuild = EnumFlag(static_cast<TraitCombatConfigFlags>(*m_activePlayerData->TraitConfigs[configIndex].CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::StarterBuild);
- if (currentlyUsesStarterBuild == useStarterBuild)
- return;
-
- if (useStarterBuild)
- SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex)
- .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::StarterBuild));
- else
- RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex)
- .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::StarterBuild));
-
- m_traitConfigStates[traitConfigId] = PLAYERSPELL_CHANGED;
-}
-
-void Player::SetTraitConfigUseSharedActionBars(int32 traitConfigId, bool usesSharedActionBars, bool isLastSelectedSavedConfig)
-{
- int32 configIndex = m_activePlayerData->TraitConfigs.FindIndexIf([traitConfigId](UF::TraitConfig const& traitConfig)
- {
- return traitConfig.ID == traitConfigId
- && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None;
- });
- if (configIndex < 0)
- return;
-
- bool currentlyUsesSharedActionBars = EnumFlag(static_cast<TraitCombatConfigFlags>(*m_activePlayerData->TraitConfigs[configIndex].CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::SharedActionBars);
- if (currentlyUsesSharedActionBars == usesSharedActionBars)
- return;
-
- if (usesSharedActionBars)
- {
- SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex)
- .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::SharedActionBars));
-
- {
- CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_TRAIT_CONFIG);
- stmt->setUInt64(0, GetGUID().GetCounter());
- stmt->setInt32(1, traitConfigId);
- CharacterDatabase.Execute(stmt);
- }
-
- if (isLastSelectedSavedConfig)
- StartLoadingActionButtons(); // load action buttons that were saved in shared mode
- }
- else
- {
- RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData)
- .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex)
- .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::SharedActionBars));
-
- // trigger a save with traitConfigId
- for (auto&& [_, button] : m_actionButtons)
- if (button.uState != ACTIONBUTTON_DELETED)
- button.uState = ACTIONBUTTON_NEW;
- }
-
- m_traitConfigStates[traitConfigId] = PLAYERSPELL_CHANGED;
-}
-
void Player::SetReputation(uint32 factionentry, int32 value)
{
GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
@@ -28947,36 +28245,6 @@ void Player::SendDisplayToast(uint32 entry, DisplayToastType type, bool isBonusR
SendDirectMessage(displayToast.Write());
}
-uint64 TraitMgr::PlayerDataAccessor::GetMoney() const
-{
- return _player->GetMoney();
-}
-
-int32 TraitMgr::PlayerDataAccessor::GetCurrencyQuantity(int32 currencyId) const
-{
- return _player->GetCurrencyQuantity(currencyId);
-}
-
-int32 TraitMgr::PlayerDataAccessor::GetLevel() const
-{
- return _player->GetLevel();
-}
-
-bool TraitMgr::PlayerDataAccessor::IsQuestRewarded(int32 questId) const
-{
- return _player->IsQuestRewarded(questId);
-}
-
-bool TraitMgr::PlayerDataAccessor::HasAchieved(int32 achievementId) const
-{
- return _player->HasAchieved(achievementId);
-}
-
-uint32 TraitMgr::PlayerDataAccessor::GetPrimarySpecialization() const
-{
- return 0;
-}
-
void Player::RequestSpellCast(std::unique_ptr<SpellCastRequest> castRequest)
{
// We are overriding an already existing spell cast request so inform the client that the old cast is being replaced
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 2fe9a2dabbe..a9ec92a7335 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -119,12 +119,6 @@ namespace WorldPackets
{
enum class UpdateCollisionHeightReason : uint8;
}
-
- namespace Traits
- {
- struct TraitConfig;
- struct TraitEntry;
- }
}
TC_GAME_API uint32 GetBagSize(Bag const* bag);
@@ -196,7 +190,6 @@ struct PlayerSpell
bool dependent : 1; // learned as result another spell learn, skill grow, quest reward, etc
bool disabled : 1; // first rank has been learned in result talent learn but currently talent unlearned, save max learned ranks
bool favorite : 1;
- Optional<int32> TraitDefinitionId;
};
extern std::array<uint32, MAX_CLASS_ID + 1> MasterySpells;
@@ -911,8 +904,6 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOAD_CUF_PROFILES,
PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION,
PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS,
- PLAYER_LOGIN_QUERY_LOAD_TRAIT_ENTRIES,
- PLAYER_LOGIN_QUERY_LOAD_TRAIT_CONFIGS,
MAX_PLAYER_LOGIN_QUERY
};
@@ -1791,8 +1782,8 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) const;
void SendKnownSpells();
void SendUnlearnSpells();
- bool AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, int32 fromSkill = 0, bool favorite = false, Optional<int32> traitDefinitionId = {});
- void LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill = 0, bool suppressMessaging = false, Optional<int32> traitDefinitionId = {});
+ bool AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, int32 fromSkill = 0, bool favorite = false);
+ void LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill = 0, bool suppressMessaging = false);
void RemoveSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true, bool suppressMessaging = false);
void ResetSpells(bool myClassOnly = false);
void LearnCustomSpells();
@@ -1855,20 +1846,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void StartLoadingActionButtons(std::function<void()>&& callback = nullptr);
void LoadActions(PreparedQueryResult result);
- // Traits
- void CreateTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig);
- void AddTraitConfig(WorldPackets::Traits::TraitConfig const& traitConfig);
- UF::TraitConfig const* GetTraitConfig(int32 configId) const;
- void UpdateTraitConfig(WorldPackets::Traits::TraitConfig&& newConfig, int32 savedConfigId, bool withCastTime);
- void ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::TraitConfig const& newConfig, bool applyTraits, bool consumeCurrencies);
- void RenameTraitConfig(int32 editedConfigId, std::string&& newName);
- void DeleteTraitConfig(int32 deletedConfigId);
- void ApplyTraitConfig(int32 configId, bool apply);
- void ApplyTraitEntry(int32 traitNodeEntryId, int32 rank, int32 grantedRanks, bool apply);
- void SetActiveCombatTraitConfigID(int32 traitConfigId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ActiveCombatTraitConfigID), traitConfigId); }
- void SetTraitConfigUseStarterBuild(int32 traitConfigId, bool useStarterBuild);
- void SetTraitConfigUseSharedActionBars(int32 traitConfigId, bool usesSharedActionBars, bool isLastSelectedSavedConfig);
-
uint32 GetFreePrimaryProfessionPoints() const { return m_activePlayerData->CharacterPoints; }
void SetFreePrimaryProfessions(uint16 profs) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterPoints), profs); }
void InitPrimaryProfessions();
@@ -2909,7 +2886,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void _LoadBGData(PreparedQueryResult result);
void _LoadGlyphs(PreparedQueryResult result);
void _LoadTalents(PreparedQueryResult talentGroupResult, PreparedQueryResult talentResult);
- void _LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult entriesResult);
void _LoadInstanceTimeRestrictions(PreparedQueryResult result);
void _LoadPetStable(uint32 summonedPetNumber, PreparedQueryResult result);
void _LoadCurrency(PreparedQueryResult result);
@@ -2937,7 +2913,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void _SaveBGData(CharacterDatabaseTransaction trans);
void _SaveGlyphs(CharacterDatabaseTransaction trans) const;
void _SaveTalents(CharacterDatabaseTransaction trans);
- void _SaveTraits(CharacterDatabaseTransaction trans);
void _SaveStats(CharacterDatabaseTransaction trans) const;
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans);
void _SaveCurrency(CharacterDatabaseTransaction trans);
@@ -3006,8 +2981,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
uint32 _resetTalentsCost;
time_t _resetTalentsTime;
- std::unordered_map<int32, PlayerSpellState> m_traitConfigStates;
-
ActionButtonList m_actionButtons;
std::array<float, BASEMOD_END> m_auraBaseFlatMod;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index bd50b2901f4..06fa07371b8 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -273,14 +273,6 @@ bool LoginQueryHolder::Initialize()
stmt->setUInt64(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_TRAIT_ENTRIES);
- stmt->setUInt64(0, lowGuid);
- res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_TRAIT_ENTRIES, stmt);
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_TRAIT_CONFIGS);
- stmt->setUInt64(0, lowGuid);
- res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_TRAIT_CONFIGS, stmt);
-
return res;
}
diff --git a/src/server/game/Handlers/TraitHandler.cpp b/src/server/game/Handlers/TraitHandler.cpp
deleted file mode 100644
index f25752d0231..00000000000
--- a/src/server/game/Handlers/TraitHandler.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "WorldSession.h"
-#include "Battleground.h"
-#include "DB2Stores.h"
-#include "Player.h"
-#include "SpellHistory.h"
-#include "TraitMgr.h"
-#include "TraitPackets.h"
-
-void WorldSession::HandleTraitsCommitConfig(WorldPackets::Traits::TraitsCommitConfig const& /*traitsCommitConfig*/)
-{
- /*
- int32 configId = traitsCommitConfig.Config.ID;
- UF::TraitConfig const* existingConfig = _player->GetTraitConfig(configId);
- if (!existingConfig)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_UNKNOWN).Write());
- return;
- }
-
- if (_player->IsInCombat())
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_AFFECTING_COMBAT).Write());
- return;
- }
-
- if (_player->GetBattleground() && _player->GetBattleground()->GetStatus() == STATUS_IN_PROGRESS)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_IN_PVP_MATCH).Write());
- return;
- }
-
- auto findEntry = [](WorldPackets::Traits::TraitConfig& config, int32 traitNodeId, int32 traitNodeEntryId) -> WorldPackets::Traits::TraitEntry*
- {
- auto entryItr = std::find_if(config.Entries.begin(), config.Entries.end(), [=](WorldPackets::Traits::TraitEntry const& traitEntry)
- {
- return traitEntry.TraitNodeID == traitNodeId && traitEntry.TraitNodeEntryID == traitNodeEntryId;
- });
- return entryItr != config.Entries.end() ? &*entryItr : nullptr;
- };
-
- bool hasRemovedEntries = false;
- WorldPackets::Traits::TraitConfig newConfigState(*existingConfig);
- for (WorldPackets::Traits::TraitEntry const& newEntry : traitsCommitConfig.Config.Entries)
- {
- WorldPackets::Traits::TraitEntry* traitEntry = findEntry(newConfigState, newEntry.TraitNodeID, newEntry.TraitNodeEntryID);
- if (traitEntry && traitEntry->Rank > newEntry.Rank)
- {
- TraitNodeEntry const* traitNode = sTraitNodeStore.LookupEntry(newEntry.TraitNodeID);
- if (!traitNode)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_UNKNOWN).Write());
- return;
- }
-
- TraitTreeEntry const* traitTree = sTraitTreeStore.LookupEntry(traitNode->TraitTreeID);
- if (!traitTree)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_UNKNOWN).Write());
- return;
- }
-
- if (traitTree->GetFlags().HasFlag(TraitTreeFlag::CannotRefund))
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_CANT_REMOVE_TALENT).Write());
- return;
- }
-
- TraitNodeEntryEntry const* traitNodeEntry = sTraitNodeEntryStore.LookupEntry(newEntry.TraitNodeEntryID);
- if (!traitNodeEntry)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_UNKNOWN).Write());
- return;
- }
-
- TraitDefinitionEntry const* traitDefinition = sTraitDefinitionStore.LookupEntry(traitNodeEntry->TraitDefinitionID);
- if (!traitDefinition)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, TALENT_FAILED_UNKNOWN).Write());
- return;
- }
-
- if (traitDefinition->SpellID && _player->GetSpellHistory()->HasCooldown(traitDefinition->SpellID))
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, traitDefinition->SpellID, TALENT_FAILED_CANT_REMOVE_TALENT).Write());
- return;
- }
-
- if (traitDefinition->VisibleSpellID && _player->GetSpellHistory()->HasCooldown(traitDefinition->VisibleSpellID))
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, traitDefinition->VisibleSpellID, TALENT_FAILED_CANT_REMOVE_TALENT).Write());
- return;
- }
-
- hasRemovedEntries = true;
- }
-
- if (traitEntry)
- {
- if (newEntry.Rank)
- traitEntry->Rank = newEntry.Rank;
- else
- newConfigState.Entries.erase(std::remove_if(newConfigState.Entries.begin(), newConfigState.Entries.end(), [&newEntry](WorldPackets::Traits::TraitEntry const& traitEntry)
- {
- return traitEntry.TraitNodeID == newEntry.TraitNodeID && traitEntry.TraitNodeEntryID == newEntry.TraitNodeEntryID;
- }), newConfigState.Entries.end());
- }
- else
- newConfigState.Entries.emplace_back() = newEntry;
- }
-
- TraitMgr::LearnResult validationResult = TraitMgr::ValidateConfig(newConfigState, _player, true);
- if (validationResult != TraitMgr::LearnResult::Ok)
- {
- SendPacket(WorldPackets::Traits::TraitConfigCommitFailed(configId, 0, AsUnderlyingType(validationResult)).Write());
- return;
- }
-
- bool needsCastTime = newConfigState.Type == TraitConfigType::Combat && hasRemovedEntries;
-
- if (traitsCommitConfig.SavedLocalIdentifier)
- newConfigState.LocalIdentifier = traitsCommitConfig.SavedLocalIdentifier;
- else if (UF::TraitConfig const* savedConfig = _player->GetTraitConfig(traitsCommitConfig.SavedLocalIdentifier))
- newConfigState.LocalIdentifier = savedConfig->LocalIdentifier;
-
- _player->UpdateTraitConfig(std::move(newConfigState), traitsCommitConfig.SavedConfigID, needsCastTime);
- */
-}
-
-void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::ClassTalentsRequestNewConfig& /*classTalentsRequestNewConfig*/)
-{
- /*
- if (classTalentsRequestNewConfig.Config.Type != TraitConfigType::Combat)
- return;
-
- if ((classTalentsRequestNewConfig.Config.CombatConfigFlags & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None)
- return;
-
- int64 configCount = std::count_if(_player->m_activePlayerData->TraitConfigs.begin(), _player->m_activePlayerData->TraitConfigs.end(), [](UF::TraitConfig const& traitConfig)
- {
- return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None;
- });
- if (configCount >= TraitMgr::MAX_COMBAT_TRAIT_CONFIGS)
- return;
-
- auto findFreeLocalIdentifier = [&]()
- {
- int32 index = 1;
- while (_player->m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& traitConfig)
- {
- return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && traitConfig.ChrSpecializationID == int32(_player->GetPrimarySpecialization())
- && traitConfig.LocalIdentifier == index;
- }) >= 0)
- ++index;
-
- return index;
- };
-
- classTalentsRequestNewConfig.Config.ChrSpecializationID = AsUnderlyingType(_player->GetPrimarySpecialization());
- classTalentsRequestNewConfig.Config.LocalIdentifier = findFreeLocalIdentifier();
-
- for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(classTalentsRequestNewConfig.Config, _player))
- {
- auto entryItr = std::find_if(classTalentsRequestNewConfig.Config.Entries.begin(), classTalentsRequestNewConfig.Config.Entries.end(),
- [&](WorldPackets::Traits::TraitEntry const& entry) { return entry.TraitNodeID == grantedEntry.TraitNodeID && entry.TraitNodeEntryID == grantedEntry.TraitNodeEntryID; });
-
- WorldPackets::Traits::TraitEntry& newEntry = entryItr != classTalentsRequestNewConfig.Config.Entries.end() ? *entryItr : classTalentsRequestNewConfig.Config.Entries.emplace_back();
- newEntry.TraitNodeID = grantedEntry.TraitNodeID;
- newEntry.TraitNodeEntryID = grantedEntry.TraitNodeEntryID;
- newEntry.Rank = grantedEntry.Rank;
- newEntry.GrantedRanks = grantedEntry.GrantedRanks;
- if (TraitNodeEntryEntry const* traitNodeEntry = sTraitNodeEntryStore.LookupEntry(grantedEntry.TraitNodeEntryID))
- if (newEntry.Rank + newEntry.GrantedRanks > traitNodeEntry->MaxRanks)
- newEntry.Rank = std::max(0, traitNodeEntry->MaxRanks - newEntry.GrantedRanks);
- }
-
- TraitMgr::LearnResult validationResult = TraitMgr::ValidateConfig(classTalentsRequestNewConfig.Config, _player);
- if (validationResult != TraitMgr::LearnResult::Ok)
- return;
-
- _player->CreateTraitConfig(classTalentsRequestNewConfig.Config);
- */
-}
-
-void WorldSession::HandleClassTalentsRenameConfig(WorldPackets::Traits::ClassTalentsRenameConfig& classTalentsRenameConfig)
-{
- _player->RenameTraitConfig(classTalentsRenameConfig.ConfigID, classTalentsRenameConfig.Name.Move());
-}
-
-void WorldSession::HandleClassTalentsDeleteConfig(WorldPackets::Traits::ClassTalentsDeleteConfig const& classTalentsDeleteConfig)
-{
- _player->DeleteTraitConfig(classTalentsDeleteConfig.ConfigID);
-}
-
-void WorldSession::HandleClassTalentsSetStarterBuildActive(WorldPackets::Traits::ClassTalentsSetStarterBuildActive const& /*classTalentsSetStarterBuildActive*/)
-{
- /*
- UF::TraitConfig const* traitConfig = _player->GetTraitConfig(classTalentsSetStarterBuildActive.ConfigID);
- if (!traitConfig)
- return;
-
- if (static_cast<TraitConfigType>(*traitConfig->Type) != TraitConfigType::Combat)
- return;
-
- if (!EnumFlag(static_cast<TraitCombatConfigFlags>(*traitConfig->CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))
- return;
-
- if (classTalentsSetStarterBuildActive.Active)
- {
- WorldPackets::Traits::TraitConfig newConfigState(*traitConfig);
-
- auto findFreeLocalIdentifier = [&]()
- {
- int32 index = 1;
- while (_player->m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& traitConfig)
- {
- return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat
- && traitConfig.ChrSpecializationID == int32(_player->GetPrimarySpecialization())
- && traitConfig.LocalIdentifier == index;
- }) >= 0)
- ++index;
-
- return index;
- };
-
- TraitMgr::InitializeStarterBuildTraitConfig(newConfigState, _player);
- newConfigState.CombatConfigFlags |= TraitCombatConfigFlags::StarterBuild;
- newConfigState.LocalIdentifier = findFreeLocalIdentifier();
-
- _player->UpdateTraitConfig(std::move(newConfigState), 0, true);
- }
- else
- _player->SetTraitConfigUseStarterBuild(classTalentsSetStarterBuildActive.ConfigID, false);
- */
-}
-
-void WorldSession::HandleClassTalentsSetUsesSharedActionBars(WorldPackets::Traits::ClassTalentsSetUsesSharedActionBars const& classTalentsSetUsesSharedActionBars)
-{
- _player->SetTraitConfigUseSharedActionBars(classTalentsSetUsesSharedActionBars.ConfigID, classTalentsSetUsesSharedActionBars.UsesShared,
- classTalentsSetUsesSharedActionBars.IsLastSelectedSavedConfig);
-}
diff --git a/src/server/game/Miscellaneous/CommonHelpers.cpp b/src/server/game/Miscellaneous/CommonHelpers.cpp
index 6dc2adc6fb3..b8eb243790a 100644
--- a/src/server/game/Miscellaneous/CommonHelpers.cpp
+++ b/src/server/game/Miscellaneous/CommonHelpers.cpp
@@ -17,6 +17,7 @@
#include "CommonHelpers.h"
#include "Common.h"
+#include "DB2Stores.h"
#include "Item.h"
#include "ItemTemplate.h"
#include "Player.h"
diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h
index d66068bb100..92e250c44cf 100644
--- a/src/server/game/Server/Packets/AllPackets.h
+++ b/src/server/game/Server/Packets/AllPackets.h
@@ -74,7 +74,6 @@
#include "TotemPackets.h"
#include "ToyPackets.h"
#include "TradePackets.h"
-#include "TraitPackets.h"
#include "TransmogrificationPackets.h"
#include "VehiclePackets.h"
#include "VoidStoragePackets.h"
diff --git a/src/server/game/Server/Packets/TraitPackets.cpp b/src/server/game/Server/Packets/TraitPackets.cpp
deleted file mode 100644
index 2c1770f6aaa..00000000000
--- a/src/server/game/Server/Packets/TraitPackets.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "TraitPackets.h"
-
-namespace WorldPackets::Traits
-{
-void TraitsCommitConfig::Read()
-{
- _worldPacket >> Config;
- _worldPacket >> SavedConfigID;
- _worldPacket >> SavedLocalIdentifier;
-}
-
-WorldPacket const* TraitConfigCommitFailed::Write()
-{
- _worldPacket << int32(ConfigID);
- _worldPacket << int32(SpellID);
- _worldPacket.WriteBits(Reason, 4);
- _worldPacket.FlushBits();
-
- return &_worldPacket;
-}
-
-void ClassTalentsRequestNewConfig::Read()
-{
- _worldPacket >> Config;
-}
-
-void ClassTalentsRenameConfig::Read()
-{
- _worldPacket >> ConfigID;
- uint32 nameLength = _worldPacket.ReadBits(9);
- Name = _worldPacket.ReadString(nameLength, false);
-}
-
-void ClassTalentsDeleteConfig::Read()
-{
- _worldPacket >> ConfigID;
-}
-
-void ClassTalentsSetStarterBuildActive::Read()
-{
- _worldPacket >> ConfigID;
- Active = _worldPacket.ReadBit();
-}
-
-void ClassTalentsSetUsesSharedActionBars::Read()
-{
- _worldPacket >> ConfigID;
- UsesShared = _worldPacket.ReadBit();
- IsLastSelectedSavedConfig = _worldPacket.ReadBit();
-}
-}
diff --git a/src/server/game/Server/Packets/TraitPackets.h b/src/server/game/Server/Packets/TraitPackets.h
deleted file mode 100644
index 88c2ae43637..00000000000
--- a/src/server/game/Server/Packets/TraitPackets.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITYCORE_TRAIT_PACKETS_H
-#define TRINITYCORE_TRAIT_PACKETS_H
-
-#include "Packet.h"
-#include "TraitPacketsCommon.h"
-
-namespace WorldPackets::Traits
-{
-class TraitsCommitConfig final : public ClientPacket
-{
-public:
- explicit TraitsCommitConfig(WorldPacket&& packet) : ClientPacket(CMSG_TRAITS_COMMIT_CONFIG, std::move(packet)) { }
-
- void Read() override;
-
- TraitConfig Config;
- int32 SavedConfigID = 0;
- int32 SavedLocalIdentifier = 0;
-};
-
-class TraitConfigCommitFailed final : public ServerPacket
-{
-public:
- TraitConfigCommitFailed(int32 configId = 0, int32 spellId = 0, int32 reason = 0) : ServerPacket(SMSG_TRAIT_CONFIG_COMMIT_FAILED, 4 + 4 + 1),
- ConfigID(configId), SpellID(spellId), Reason(reason) { }
-
- WorldPacket const* Write() override;
-
- int32 ConfigID;
- int32 SpellID;
- int32 Reason;
-};
-
-class ClassTalentsRequestNewConfig final : public ClientPacket
-{
-public:
- explicit ClassTalentsRequestNewConfig(WorldPacket&& packet) : ClientPacket(CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG, std::move(packet)) { }
-
- void Read() override;
-
- TraitConfig Config;
-};
-
-class ClassTalentsRenameConfig final : public ClientPacket
-{
-public:
- explicit ClassTalentsRenameConfig(WorldPacket&& packet) : ClientPacket(CMSG_CLASS_TALENTS_RENAME_CONFIG, std::move(packet)) { }
-
- void Read() override;
-
- int32 ConfigID = 0;
- String<259> Name;
-};
-
-class ClassTalentsDeleteConfig final : public ClientPacket
-{
-public:
- explicit ClassTalentsDeleteConfig(WorldPacket&& packet) : ClientPacket(CMSG_CLASS_TALENTS_DELETE_CONFIG, std::move(packet)) { }
-
- void Read() override;
-
- int32 ConfigID = 0;
-};
-
-class ClassTalentsSetStarterBuildActive final : public ClientPacket
-{
-public:
- explicit ClassTalentsSetStarterBuildActive(WorldPacket&& packet) : ClientPacket(CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE, std::move(packet)) { }
-
- void Read() override;
-
- int32 ConfigID = 0;
- bool Active = false;
-};
-
-class ClassTalentsSetUsesSharedActionBars final : public ClientPacket
-{
-public:
- explicit ClassTalentsSetUsesSharedActionBars(WorldPacket&& packet) : ClientPacket(CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS, std::move(packet)) { }
-
- void Read() override;
-
- int32 ConfigID = 0;
- bool UsesShared = false;
- bool IsLastSelectedSavedConfig = false;
-};
-}
-
-#endif // TRINITYCORE_TRAIT_PACKETS_H
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index f0c5e1e1088..55249504f6a 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -334,13 +334,13 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePlayerChoiceResponse);
DEFINE_HANDLER(CMSG_CHROMIE_TIME_SELECT_EXPANSION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLAIM_WEEKLY_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_CLASS_TALENTS_DELETE_CONFIG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleClassTalentsDeleteConfig);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_DELETE_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_CLASS_TALENTS_RENAME_CONFIG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleClassTalentsRenameConfig);
- DEFINE_HANDLER(CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClassTalentsRequestNewConfig);
- DEFINE_HANDLER(CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleClassTalentsSetStarterBuildActive);
- DEFINE_HANDLER(CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleClassTalentsSetUsesSharedActionBars);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_RENAME_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLEAR_NEW_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearRaidMarker);
DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode);
@@ -921,7 +921,7 @@ void OpcodeTable::InitializeClientOpcodes()
DEFINE_HANDLER(CMSG_TRADE_SKILL_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTradeSkillSetFavorite);
DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTrainerBuySpellOpcode);
DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTrainerListOpcode);
- DEFINE_HANDLER(CMSG_TRAITS_COMMIT_CONFIG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTraitsCommitConfig);
+ DEFINE_HANDLER(CMSG_TRAITS_COMMIT_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems);
DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetition);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 9693f3a4303..628428ba656 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -764,16 +764,6 @@ namespace WorldPackets
class TradeStatus;
}
- namespace Traits
- {
- class TraitsCommitConfig;
- class ClassTalentsRequestNewConfig;
- class ClassTalentsRenameConfig;
- class ClassTalentsDeleteConfig;
- class ClassTalentsSetStarterBuildActive;
- class ClassTalentsSetUsesSharedActionBars;
- }
-
namespace Transmogrification
{
class TransmogrifyItems;
@@ -1503,13 +1493,6 @@ class TC_GAME_API WorldSession
void HandleUnlearnSkillOpcode(WorldPackets::Spells::UnlearnSkill& packet);
void HandleTradeSkillSetFavorite(WorldPackets::Spells::TradeSkillSetFavorite const& tradeSkillSetFavorite);
- void HandleTraitsCommitConfig(WorldPackets::Traits::TraitsCommitConfig const& traitsCommitConfig);
- void HandleClassTalentsRequestNewConfig(WorldPackets::Traits::ClassTalentsRequestNewConfig& classTalentsRequestNewConfig);
- void HandleClassTalentsRenameConfig(WorldPackets::Traits::ClassTalentsRenameConfig& classTalentsRenameConfig);
- void HandleClassTalentsDeleteConfig(WorldPackets::Traits::ClassTalentsDeleteConfig const& classTalentsDeleteConfig);
- void HandleClassTalentsSetStarterBuildActive(WorldPackets::Traits::ClassTalentsSetStarterBuildActive const& classTalentsSetStarterBuildActive);
- void HandleClassTalentsSetUsesSharedActionBars(WorldPackets::Traits::ClassTalentsSetUsesSharedActionBars const& classTalentsSetUsesSharedActionBars);
-
void HandleQuestgiverStatusQueryOpcode(WorldPackets::Quest::QuestGiverStatusQuery& packet);
void HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& packet);
void HandleQuestgiverStatusTrackedQueryOpcode(WorldPackets::Quest::QuestGiverStatusTrackedQuery& questGiverStatusTrackedQuery);
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 591e66695a9..2caa6d6d041 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -59,7 +59,6 @@
#include "SpellScript.h"
#include "TemporarySummon.h"
#include "TradeData.h"
-#include "TraitPackets.h"
#include "UniqueTrackablePtr.h"
#include "Util.h"
#include "VMapFactory.h"
@@ -4385,14 +4384,7 @@ void Spell::finish(SpellCastResult result)
Unit::ProcSkillsAndAuras(unitCaster, nullptr, PROC_FLAG_CAST_ENDED, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_NONE, PROC_HIT_NONE, this, nullptr, nullptr);
if (result != SPELL_CAST_OK)
- {
- // on failure (or manual cancel) send TraitConfigCommitFailed to revert talent UI saved config selection
- if (m_caster->IsPlayer() && m_spellInfo->HasEffect(SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG))
- if (WorldPackets::Traits::TraitConfig const* traitConfig = std::any_cast<WorldPackets::Traits::TraitConfig>(&m_customArg))
- m_caster->ToPlayer()->SendDirectMessage(WorldPackets::Traits::TraitConfigCommitFailed(traitConfig->ID).Write());
-
return;
- }
if (unitCaster->GetTypeId() == TYPEID_UNIT && unitCaster->IsSummon())
{
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index e6b03408192..ba900f703aa 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -425,8 +425,6 @@ class TC_GAME_API Spell
void EffectModifyCooldowns();
void EffectModifyCooldownsByCategory();
void EffectModifySpellCharges();
- void EffectCreateTraitTreeConfig();
- void EffectChangeActiveCombatTraitConfig();
void EffectTeleportGraveyard();
void EffectActivateRune();
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 2502a2a66d3..b8a31fb2c99 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -75,7 +75,6 @@
#include "TalentPackets.h"
#include "TemporarySummon.h"
#include "Totem.h"
-#include "TraitMgr.h"
#include "TraitPacketsCommon.h"
#include "Unit.h"
#include "Util.h"
@@ -388,8 +387,8 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF
&Spell::EffectUnused, //300 SPELL_EFFECT_300
&Spell::EffectNULL, //301 SPELL_EFFECT_CRAFT_ENCHANT
&Spell::EffectNULL, //302 SPELL_EFFECT_GATHERING
- &Spell::EffectCreateTraitTreeConfig, //303 SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG
- &Spell::EffectChangeActiveCombatTraitConfig, //304 SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG
+ &Spell::EffectNULL, //303 SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG
+ &Spell::EffectNULL, //304 SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG
&Spell::EffectNULL, //305 SPELL_EFFECT_305
&Spell::EffectNULL, //306 SPELL_EFFECT_UPDATE_INTERACTIONS
&Spell::EffectNULL, //307 SPELL_EFFECT_307
@@ -5890,47 +5889,6 @@ void Spell::EffectModifySpellCharges()
unitTarget->GetSpellHistory()->RestoreCharge(effectInfo->MiscValue);
}
-void Spell::EffectCreateTraitTreeConfig()
-{
- if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
- return;
-
- Player* target = Object::ToPlayer(unitTarget);
- if (!target)
- return;
-
- WorldPackets::Traits::TraitConfig newConfig;
- newConfig.Type = TraitMgr::GetConfigTypeForTree(effectInfo->MiscValue);
- if (newConfig.Type != TraitConfigType::Generic)
- return;
-
- newConfig.TraitSystemID = sTraitTreeStore.AssertEntry(effectInfo->MiscValue)->TraitSystemID;
- int32 existingConfigForSystem = target->m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& config)
- {
- return static_cast<TraitConfigType>(*config.Type) == TraitConfigType::Generic
- && config.TraitSystemID == newConfig.TraitSystemID;
- });
-
- if (existingConfigForSystem < 0)
- target->CreateTraitConfig(newConfig);
-}
-
-void Spell::EffectChangeActiveCombatTraitConfig()
-{
- if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
- return;
-
- Player* target = Object::ToPlayer(unitTarget);
- if (!target)
- return;
-
- WorldPackets::Traits::TraitConfig* traitConfig = std::any_cast<WorldPackets::Traits::TraitConfig>(&m_customArg);
- if (!traitConfig)
- return;
-
- target->UpdateTraitConfig(std::move(*traitConfig), damage, false);
-}
-
void Spell::EffectTeleportGraveyard()
{
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
diff --git a/src/server/game/Spells/TraitMgr.cpp b/src/server/game/Spells/TraitMgr.cpp
deleted file mode 100644
index 017f7757cfa..00000000000
--- a/src/server/game/Spells/TraitMgr.cpp
+++ /dev/null
@@ -1,748 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "TraitMgr.h"
-#include "DB2Stores.h"
-#include "IteratorPair.h"
-#include "MapUtils.h"
-#include "TraitPacketsCommon.h"
-#include "UpdateFields.h"
-
-namespace TraitMgr
-{
-namespace
-{
-struct NodeEntry;
-struct Node;
-struct NodeGroup;
-struct Tree;
-
-struct NodeEntry
-{
- TraitNodeEntryEntry const* Data = nullptr;
- std::vector<TraitCondEntry const*> Conditions;
- std::vector<TraitCostEntry const*> Costs;
-};
-
-struct Node
-{
- TraitNodeEntry const* Data = nullptr;
- std::vector<NodeEntry> Entries;
- std::vector<NodeGroup const*> Groups;
- std::vector<std::pair<Node const*, TraitEdgeType>> ParentNodes; // TraitEdge::LeftTraitNodeID
- std::vector<TraitCondEntry const*> Conditions;
- std::vector<TraitCostEntry const*> Costs;
-};
-
-struct NodeGroup
-{
- TraitNodeGroupEntry const* Data = nullptr;
- std::vector<TraitCondEntry const*> Conditions;
- std::vector<TraitCostEntry const*> Costs;
- std::vector<Node const*> Nodes;
-};
-
-struct Tree
-{
- TraitTreeEntry const* Data = nullptr;
- std::vector<Node const*> Nodes;
- std::vector<TraitCostEntry const*> Costs;
- std::vector<TraitCurrencyEntry const*> Currencies;
- TraitConfigType ConfigType = TraitConfigType::Invalid;
-};
-
-std::unordered_map<int32, NodeGroup> _traitGroups;
-std::unordered_map<int32, Node> _traitNodes;
-std::unordered_map<int32, Tree> _traitTrees;
-std::array<int32, MAX_CLASSES> _skillLinesByClass;
-std::unordered_map<int32, std::vector<Tree const*>> _traitTreesBySkillLine;
-std::unordered_map<int32, std::vector<Tree const*>> _traitTreesByTraitSystem;
-int32 _configIdGenerator = 0;
-std::unordered_map<int32, std::vector<TraitCurrencySourceEntry const*>> _traitCurrencySourcesByCurrency;
-std::unordered_map<int32, std::vector<TraitDefinitionEffectPointsEntry const*>> _traitDefinitionEffectPointModifiers;
-std::unordered_map<int32, std::vector<TraitTreeLoadoutEntryEntry const*>> _traitTreeLoadoutsByChrSpecialization;
-}
-
-void Load()
-{
- _configIdGenerator = time(nullptr);
-
- std::unordered_map<int32, std::vector<TraitCondEntry const*>> nodeEntryConditions;
- for (TraitNodeEntryXTraitCondEntry const* traitNodeEntryXTraitCondEntry : sTraitNodeEntryXTraitCondStore)
- if (TraitCondEntry const* traitCondEntry = sTraitCondStore.LookupEntry(traitNodeEntryXTraitCondEntry->TraitCondID))
- nodeEntryConditions[traitNodeEntryXTraitCondEntry->TraitNodeEntryID].push_back(traitCondEntry);
-
- std::unordered_map<int32, std::vector<TraitCostEntry const*>> nodeEntryCosts;
- for (TraitNodeEntryXTraitCostEntry const* traitNodeEntryXTraitCostEntry : sTraitNodeEntryXTraitCostStore)
- if (TraitCostEntry const* traitCostEntry = sTraitCostStore.LookupEntry(traitNodeEntryXTraitCostEntry->TraitCostID))
- nodeEntryCosts[traitNodeEntryXTraitCostEntry->TraitNodeEntryID].push_back(traitCostEntry);
-
- std::unordered_map<int32, std::vector<TraitCondEntry const*>> nodeGroupConditions;
- for (TraitNodeGroupXTraitCondEntry const* traitNodeGroupXTraitCondEntry : sTraitNodeGroupXTraitCondStore)
- if (TraitCondEntry const* traitCondEntry = sTraitCondStore.LookupEntry(traitNodeGroupXTraitCondEntry->TraitCondID))
- nodeGroupConditions[traitNodeGroupXTraitCondEntry->TraitNodeGroupID].push_back(traitCondEntry);
-
- std::unordered_map<int32, std::vector<TraitCostEntry const*>> nodeGroupCosts;
- for (TraitNodeGroupXTraitCostEntry const* traitNodeGroupXTraitCostEntry : sTraitNodeGroupXTraitCostStore)
- if (TraitCostEntry const* traitCondEntry = sTraitCostStore.LookupEntry(traitNodeGroupXTraitCostEntry->TraitCostID))
- nodeGroupCosts[traitNodeGroupXTraitCostEntry->TraitNodeGroupID].push_back(traitCondEntry);
-
- std::unordered_multimap<int32, int32> nodeGroups;
- for (TraitNodeGroupXTraitNodeEntry const* traitNodeGroupXTraitNodeEntry : sTraitNodeGroupXTraitNodeStore)
- nodeGroups.emplace(traitNodeGroupXTraitNodeEntry->TraitNodeID, traitNodeGroupXTraitNodeEntry->TraitNodeGroupID);
-
- std::unordered_map<int32, std::vector<TraitCondEntry const*>> nodeConditions;
- for (TraitNodeXTraitCondEntry const* traitNodeXTraitCondEntry : sTraitNodeXTraitCondStore)
- if (TraitCondEntry const* traitCondEntry = sTraitCondStore.LookupEntry(traitNodeXTraitCondEntry->TraitCondID))
- nodeConditions[traitNodeXTraitCondEntry->TraitNodeID].push_back(traitCondEntry);
-
- std::unordered_map<int32, std::vector<TraitCostEntry const*>> nodeCosts;
- for (TraitNodeXTraitCostEntry const* traitNodeXTraitCostEntry : sTraitNodeXTraitCostStore)
- if (TraitCostEntry const* traitCostEntry = sTraitCostStore.LookupEntry(traitNodeXTraitCostEntry->TraitCostID))
- nodeCosts[traitNodeXTraitCostEntry->TraitNodeID].push_back(traitCostEntry);
-
- std::unordered_multimap<int32, TraitNodeEntryEntry const*> nodeEntries;
- for (TraitNodeXTraitNodeEntryEntry const* traitNodeXTraitNodeEntryEntry : sTraitNodeXTraitNodeEntryStore)
- if (TraitNodeEntryEntry const* traitNodeEntryEntry = sTraitNodeEntryStore.LookupEntry(traitNodeXTraitNodeEntryEntry->TraitNodeEntryID))
- nodeEntries.emplace(traitNodeXTraitNodeEntryEntry->TraitNodeID, traitNodeEntryEntry);
-
- std::unordered_map<int32, std::vector<TraitCostEntry const*>> treeCosts;
- for (TraitTreeXTraitCostEntry const* traitTreeXTraitCostEntry : sTraitTreeXTraitCostStore)
- if (TraitCostEntry const* traitCostEntry = sTraitCostStore.LookupEntry(traitTreeXTraitCostEntry->TraitCostID))
- treeCosts[traitTreeXTraitCostEntry->TraitTreeID].push_back(traitCostEntry);
-
- std::unordered_map<int32, std::vector<TraitCurrencyEntry const*>> treeCurrencies;
- for (TraitTreeXTraitCurrencyEntry const* traitTreeXTraitCurrencyEntry : sTraitTreeXTraitCurrencyStore)
- if (TraitCurrencyEntry const* traitCurrencyEntry = sTraitCurrencyStore.LookupEntry(traitTreeXTraitCurrencyEntry->TraitCurrencyID))
- treeCurrencies[traitTreeXTraitCurrencyEntry->TraitTreeID].push_back(traitCurrencyEntry);
-
- std::unordered_map<int32, std::vector<int32>> traitTreesIdsByTraitSystem;
-
- for (TraitTreeEntry const* traitTree : sTraitTreeStore)
- {
- Tree& tree = _traitTrees[traitTree->ID];
- tree.Data = traitTree;
-
- if (std::vector<TraitCostEntry const*>* costs = Trinity::Containers::MapGetValuePtr(treeCosts, traitTree->ID))
- tree.Costs = std::move(*costs);
-
- if (std::vector<TraitCurrencyEntry const*>* currencies = Trinity::Containers::MapGetValuePtr(treeCurrencies, traitTree->ID))
- tree.Currencies = std::move(*currencies);
-
- if (traitTree->TraitSystemID)
- {
- traitTreesIdsByTraitSystem[traitTree->TraitSystemID].push_back(traitTree->ID);
- tree.ConfigType = TraitConfigType::Generic;
- }
- }
-
- for (TraitNodeGroupEntry const* traitNodeGroup : sTraitNodeGroupStore)
- {
- NodeGroup& nodeGroup = _traitGroups[traitNodeGroup->ID];
- nodeGroup.Data = traitNodeGroup;
-
- if (std::vector<TraitCondEntry const*>* conditions = Trinity::Containers::MapGetValuePtr(nodeGroupConditions, traitNodeGroup->ID))
- nodeGroup.Conditions = std::move(*conditions);
-
- if (std::vector<TraitCostEntry const*>* costs = Trinity::Containers::MapGetValuePtr(nodeGroupCosts, traitNodeGroup->ID))
- nodeGroup.Costs = std::move(*costs);
- }
-
- for (TraitNodeEntry const* traitNode : sTraitNodeStore)
- {
- Node& node = _traitNodes[traitNode->ID];
- node.Data = traitNode;
-
- if (Tree* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, traitNode->TraitTreeID))
- tree->Nodes.push_back(&node);
-
- for (auto&& [_, traitNodeEntry] : Trinity::Containers::MapEqualRange(nodeEntries, traitNode->ID))
- {
- NodeEntry& entry = node.Entries.emplace_back();
- entry.Data = traitNodeEntry;
-
- if (std::vector<TraitCondEntry const*>* conditions = Trinity::Containers::MapGetValuePtr(nodeEntryConditions, traitNodeEntry->ID))
- entry.Conditions = std::move(*conditions);
-
- if (std::vector<TraitCostEntry const*>* costs = Trinity::Containers::MapGetValuePtr(nodeEntryCosts, traitNodeEntry->ID))
- entry.Costs = std::move(*costs);
- }
-
- for (auto&& [_, nodeGroupId] : Trinity::Containers::MapEqualRange(nodeGroups, traitNode->ID))
- {
- NodeGroup* nodeGroup = Trinity::Containers::MapGetValuePtr(_traitGroups, nodeGroupId);
- if (!nodeGroup)
- continue;
-
- nodeGroup->Nodes.push_back(&node);
- node.Groups.push_back(nodeGroup);
- }
-
- if (std::vector<TraitCondEntry const*>* conditions = Trinity::Containers::MapGetValuePtr(nodeConditions, traitNode->ID))
- node.Conditions = std::move(*conditions);
-
- if (std::vector<TraitCostEntry const*>* costs = Trinity::Containers::MapGetValuePtr(nodeCosts, traitNode->ID))
- node.Costs = std::move(*costs);
- }
-
- for (TraitEdgeEntry const* traitEdgeEntry : sTraitEdgeStore)
- {
- Node* left = Trinity::Containers::MapGetValuePtr(_traitNodes, traitEdgeEntry->LeftTraitNodeID);
- Node* right = Trinity::Containers::MapGetValuePtr(_traitNodes, traitEdgeEntry->RightTraitNodeID);
- if (!left || !right)
- continue;
-
- right->ParentNodes.emplace_back(left, static_cast<TraitEdgeType>(traitEdgeEntry->Type));
- }
-
- for (SkillLineXTraitTreeEntry const* skillLineXTraitTreeEntry : sSkillLineXTraitTreeStore)
- {
- Tree* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, skillLineXTraitTreeEntry->TraitTreeID);
- if (!tree)
- continue;
-
- SkillLineEntry const* skillLineEntry = sSkillLineStore.LookupEntry(skillLineXTraitTreeEntry->SkillLineID);
- if (!skillLineEntry)
- continue;
-
- _traitTreesBySkillLine[skillLineXTraitTreeEntry->SkillLineID].push_back(tree);
- if (skillLineEntry->CategoryID == SKILL_CATEGORY_CLASS)
- {
- for (SkillRaceClassInfoEntry const* skillRaceClassInfo : sDB2Manager.GetSkillRaceClassInfo(skillLineEntry->ID))
- for (int32 i = 1; i < MAX_CLASSES; ++i)
- if (skillRaceClassInfo->ClassMask & (1 << (i - 1)))
- _skillLinesByClass[i] = skillLineXTraitTreeEntry->SkillLineID;
-
- tree->ConfigType = TraitConfigType::Combat;
- }
- else
- tree->ConfigType = TraitConfigType::Profession;
- }
-
- for (auto&& [traitSystemId, traitTreeIds] : traitTreesIdsByTraitSystem)
- for (int32 traitTreeId : traitTreeIds)
- if (Tree* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, traitTreeId))
- _traitTreesByTraitSystem[traitSystemId].push_back(tree);
-
- for (TraitCurrencySourceEntry const* traitCurrencySource : sTraitCurrencySourceStore)
- _traitCurrencySourcesByCurrency[traitCurrencySource->TraitCurrencyID].push_back(traitCurrencySource);
-
- for (TraitDefinitionEffectPointsEntry const* traitDefinitionEffectPoints : sTraitDefinitionEffectPointsStore)
- _traitDefinitionEffectPointModifiers[traitDefinitionEffectPoints->TraitDefinitionID].push_back(traitDefinitionEffectPoints);
-
- std::unordered_map<int32, std::vector<TraitTreeLoadoutEntryEntry const*>> traitTreeLoadoutEntries;
- for (TraitTreeLoadoutEntryEntry const* traitTreeLoadoutEntry : sTraitTreeLoadoutEntryStore)
- traitTreeLoadoutEntries[traitTreeLoadoutEntry->TraitTreeLoadoutID].push_back(traitTreeLoadoutEntry);
-
- for (TraitTreeLoadoutEntry const* traitTreeLoadout : sTraitTreeLoadoutStore)
- {
- if (std::vector<TraitTreeLoadoutEntryEntry const*>* entries = Trinity::Containers::MapGetValuePtr(traitTreeLoadoutEntries, traitTreeLoadout->ID))
- {
- std::ranges::sort(*entries, std::ranges::less(), &TraitTreeLoadoutEntryEntry::OrderIndex);
- // there should be only one loadout per spec, we take last one encountered
- _traitTreeLoadoutsByChrSpecialization[traitTreeLoadout->ChrSpecializationID] = std::move(*entries);
- }
- }
-}
-
-/**
- * Generates new TraitConfig identifier.
- * Because this only needs to be unique for each character we let it overflow
-*/
-int32 GenerateNewTraitConfigId()
-{
- if (_configIdGenerator == std::numeric_limits<int32>::max())
- _configIdGenerator = 0;
-
- return ++_configIdGenerator;
-}
-
-TraitConfigType GetConfigTypeForTree(int32 traitTreeId)
-{
- Tree const* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, traitTreeId);
- if (!tree)
- return TraitConfigType::Invalid;
-
- return tree->ConfigType;
-}
-
-/**
- * @brief Finds relevant TraitTree identifiers
- * @param traitConfig config data
- * @return Trait tree data
-*/
-std::vector<Tree const*> const* GetTreesForConfig(WorldPackets::Traits::TraitConfig const& /*traitConfig*/)
-{
- /*
- switch (traitConfig.Type)
- {
- case TraitConfigType::Combat:
- if (ChrSpecializationEntry const* chrSpecializationEntry = sChrSpecializationStore.LookupEntry(traitConfig.ChrSpecializationID))
- return Trinity::Containers::MapGetValuePtr(_traitTreesBySkillLine, _skillLinesByClass[chrSpecializationEntry->ClassID]);
- break;
- case TraitConfigType::Profession:
- return Trinity::Containers::MapGetValuePtr(_traitTreesBySkillLine, traitConfig.SkillLineID);
- case TraitConfigType::Generic:
- return Trinity::Containers::MapGetValuePtr(_traitTreesByTraitSystem, traitConfig.TraitSystemID);
- default:
- break;
- }
- */
-
- return nullptr;
-}
-
-bool HasEnoughCurrency(WorldPackets::Traits::TraitEntry const& entry, std::map<int32, int32> const& currencies)
-{
- auto getCurrencyCount = [&](int32 currencyId)
- {
- int32 const* count = Trinity::Containers::MapGetValuePtr(currencies, currencyId);
- return count ? *count : 0;
- };
-
- Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, entry.TraitNodeID);
- for (NodeGroup const* group : node->Groups)
- for (TraitCostEntry const* cost : group->Costs)
- if (getCurrencyCount(cost->TraitCurrencyID) < cost->Amount * entry.Rank)
- return false;
-
- auto nodeEntryItr = std::ranges::find_if(node->Entries, [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
- if (nodeEntryItr != node->Entries.end())
- for (TraitCostEntry const* cost : nodeEntryItr->Costs)
- if (getCurrencyCount(cost->TraitCurrencyID) < cost->Amount * entry.Rank)
- return false;
-
- for (TraitCostEntry const* cost : node->Costs)
- if (getCurrencyCount(cost->TraitCurrencyID) < cost->Amount * entry.Rank)
- return false;
-
- if (Tree const* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, node->Data->TraitTreeID))
- for (TraitCostEntry const* cost : tree->Costs)
- if (getCurrencyCount(cost->TraitCurrencyID) < cost->Amount * entry.Rank)
- return false;
-
- return true;
-}
-
-void TakeCurrencyCost(WorldPackets::Traits::TraitEntry const& entry, std::map<int32, int32>& currencies)
-{
- Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, entry.TraitNodeID);
- for (NodeGroup const* group : node->Groups)
- for (TraitCostEntry const* cost : group->Costs)
- currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank;
-
- auto nodeEntryItr = std::ranges::find_if(node->Entries, [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
- if (nodeEntryItr != node->Entries.end())
- for (TraitCostEntry const* cost : nodeEntryItr->Costs)
- currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank;
-
- for (TraitCostEntry const* cost : node->Costs)
- currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank;
-
- if (Tree const* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, node->Data->TraitTreeID))
- for (TraitCostEntry const* cost : tree->Costs)
- currencies[cost->TraitCurrencyID] -= cost->Amount * entry.Rank;
-}
-
-void FillOwnedCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, std::map<int32, int32>& currencies)
-{
- std::vector<Tree const*> const* trees = GetTreesForConfig(traitConfig);
- if (!trees)
- return;
-
- auto hasTraitNodeEntry = [&traitConfig](int32 traitNodeEntryId)
- {
- return std::ranges::find_if(traitConfig.Entries, [traitNodeEntryId](WorldPackets::Traits::TraitEntry const& traitEntry)
- {
- return traitEntry.TraitNodeEntryID == traitNodeEntryId && (traitEntry.Rank > 0 || traitEntry.GrantedRanks > 0);
- }) != traitConfig.Entries.end();
- };
-
- for (Tree const* tree : *trees)
- {
- for (TraitCurrencyEntry const* currency : tree->Currencies)
- {
- switch (currency->GetType())
- {
- case TraitCurrencyType::Gold:
- {
- int32& amount = currencies[currency->ID];
- if (player.GetMoney() > uint64(std::numeric_limits<int32>::max() - amount))
- amount = std::numeric_limits<int32>::max();
- else
- amount += player.GetMoney();
- break;
- }
- case TraitCurrencyType::CurrencyTypesBased:
- currencies[currency->ID] += player.GetCurrencyQuantity(currency->CurrencyTypesID);
- break;
- case TraitCurrencyType::TraitSourced:
- if (std::vector<TraitCurrencySourceEntry const*> const* currencySources = Trinity::Containers::MapGetValuePtr(_traitCurrencySourcesByCurrency, currency->ID))
- {
- for (TraitCurrencySourceEntry const* currencySource : *currencySources)
- {
- if (currencySource->QuestID && !player.IsQuestRewarded(currencySource->QuestID))
- continue;
-
- if (currencySource->AchievementID && !player.HasAchieved(currencySource->AchievementID))
- continue;
-
- if (currencySource->PlayerLevel && player.GetLevel() < currencySource->PlayerLevel)
- continue;
-
- if (currencySource->TraitNodeEntryID && !hasTraitNodeEntry(currencySource->TraitNodeEntryID))
- continue;
-
- currencies[currencySource->TraitCurrencyID] += currencySource->Amount;
- }
- }
- break;
- default:
- break;
- }
- }
- }
-}
-
-void FillSpentCurrenciesMap(WorldPackets::Traits::TraitEntry const& entry, std::map<int32, int32>& cachedCurrencies)
-{
- Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, entry.TraitNodeID);
- for (NodeGroup const* group : node->Groups)
- for (TraitCostEntry const* cost : group->Costs)
- cachedCurrencies[cost->TraitCurrencyID] += cost->Amount * entry.Rank;
-
- auto nodeEntryItr = std::ranges::find_if(node->Entries, [&entry](NodeEntry const& nodeEntry) { return int32(nodeEntry.Data->ID) == entry.TraitNodeEntryID; });
- if (nodeEntryItr != node->Entries.end())
- for (TraitCostEntry const* cost : nodeEntryItr->Costs)
- cachedCurrencies[cost->TraitCurrencyID] += cost->Amount * entry.Rank;
-
- for (TraitCostEntry const* cost : node->Costs)
- cachedCurrencies[cost->TraitCurrencyID] += cost->Amount * entry.Rank;
-
- if (Tree const* tree = Trinity::Containers::MapGetValuePtr(_traitTrees, node->Data->TraitTreeID))
- for (TraitCostEntry const* cost : tree->Costs)
- cachedCurrencies[cost->TraitCurrencyID] += cost->Amount * entry.Rank;
-}
-
-void FillSpentCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig, std::map<int32, int32>& cachedCurrencies)
-{
- for (WorldPackets::Traits::TraitEntry const& entry : traitConfig.Entries)
- FillSpentCurrenciesMap(entry, cachedCurrencies);
-}
-
-bool MeetsTraitCondition(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, TraitCondEntry const* condition,
- Optional<std::map<int32, int32>>& cachedCurrencies)
-{
- if (condition->QuestID && !player.IsQuestRewarded(condition->QuestID))
- return false;
-
- if (condition->AchievementID && !player.HasAchieved(condition->AchievementID))
- return false;
-
- /*
- if (condition->SpecSetID)
- {
- uint32 chrSpecializationId = player.GetPrimarySpecialization();
- if (traitConfig.Type == TraitConfigType::Combat)
- chrSpecializationId = traitConfig.ChrSpecializationID;
-
- if (!sDB2Manager.IsSpecSetMember(condition->SpecSetID, chrSpecializationId))
- return false;
- }
- */
-
- if (condition->TraitCurrencyID && condition->SpentAmountRequired)
- {
- if (!cachedCurrencies)
- FillSpentCurrenciesMap(traitConfig, cachedCurrencies.emplace());
-
- if (condition->TraitNodeGroupID)
- {
- auto itr = cachedCurrencies->try_emplace(condition->TraitCurrencyID, 0).first;
- if (itr->second < condition->SpentAmountRequired)
- return false;
- }
- else if (condition->TraitNodeID)
- {
- auto itr = cachedCurrencies->try_emplace(condition->TraitCurrencyID, 0).first;
- if (itr->second < condition->SpentAmountRequired)
- return false;
- }
- }
-
- if (condition->RequiredLevel && player.GetLevel() < condition->RequiredLevel)
- return false;
-
- return true;
-}
-
-std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player)
-{
- std::vector<UF::TraitEntry> entries;
- std::vector<Tree const*> const* trees = GetTreesForConfig(traitConfig);
- if (!trees)
- return entries;
-
- auto getOrCreateEntry = [&entries](int32 nodeId, int32 entryId)
- {
- auto itr = std::ranges::find_if(entries, [&](UF::TraitEntry const& traitEntry)
- {
- return traitEntry.TraitNodeID == nodeId && traitEntry.TraitNodeEntryID == entryId;
- });
- if (itr == entries.end())
- {
- itr = entries.emplace(entries.end());
- itr->TraitNodeID = nodeId;
- itr->TraitNodeEntryID = entryId;
- itr->Rank = 0;
- itr->GrantedRanks = 0;
- }
- return &*itr;
- };
-
- Optional<std::map<int32, int32>> cachedCurrencies;
-
- for (Tree const* tree : *trees)
- {
- for (Node const* node : tree->Nodes)
- {
- for (NodeEntry const& entry : node->Entries)
- for (TraitCondEntry const* condition : entry.Conditions)
- if (condition->GetCondType() == TraitConditionType::Granted && MeetsTraitCondition(traitConfig, player, condition, cachedCurrencies))
- getOrCreateEntry(node->Data->ID, entry.Data->ID)->GrantedRanks += condition->GrantedRanks;
-
- for (TraitCondEntry const* condition : node->Conditions)
- if (condition->GetCondType() == TraitConditionType::Granted && MeetsTraitCondition(traitConfig, player, condition, cachedCurrencies))
- for (NodeEntry const& entry : node->Entries)
- getOrCreateEntry(node->Data->ID, entry.Data->ID)->GrantedRanks += condition->GrantedRanks;
-
- for (NodeGroup const* group : node->Groups)
- for (TraitCondEntry const* condition : group->Conditions)
- if (condition->GetCondType() == TraitConditionType::Granted && MeetsTraitCondition(traitConfig, player, condition, cachedCurrencies))
- for (NodeEntry const& entry : node->Entries)
- getOrCreateEntry(node->Data->ID, entry.Data->ID)->GrantedRanks += condition->GrantedRanks;
- }
- }
-
- return entries;
-}
-
-bool IsValidEntry(WorldPackets::Traits::TraitEntry const& traitEntry)
-{
- Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, traitEntry.TraitNodeID);
- if (!node)
- return false;
-
- auto entryItr = std::ranges::find_if(node->Entries, [&](NodeEntry const& entry) { return entry.Data->ID == uint32(traitEntry.TraitNodeEntryID); });
- if (entryItr == node->Entries.end())
- return false;
-
- if (entryItr->Data->MaxRanks < traitEntry.Rank + traitEntry.GrantedRanks)
- return false;
-
- return true;
-}
-
-LearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, bool requireSpendingAllCurrencies /*= false*/)
-{
- auto getNodeEntryCount = [&](int32 traitNodeId)
- {
- return std::ranges::count(traitConfig.Entries, traitNodeId, &WorldPackets::Traits::TraitEntry::TraitNodeID);
- };
-
- auto getNodeEntry = [&](int32 traitNodeId, int32 traitNodeEntryId)
- {
- auto entryItr = std::ranges::find_if(traitConfig.Entries, [=](WorldPackets::Traits::TraitEntry const& traitEntry)
- {
- return traitEntry.TraitNodeID == traitNodeId && traitEntry.TraitNodeEntryID == traitNodeEntryId;
- });
- return entryItr != traitConfig.Entries.end() ? &*entryItr : nullptr;
- };
-
- auto isNodeFullyFilled = [&](Node const* node)
- {
- auto nodeEntryMatches = [&](NodeEntry const& nodeEntry)
- {
- WorldPackets::Traits::TraitEntry const* traitEntry = getNodeEntry(node->Data->ID, nodeEntry.Data->ID);
- return traitEntry && (traitEntry->Rank + traitEntry->GrantedRanks) == nodeEntry.Data->MaxRanks;
- };
-
- if (node->Data->GetType() == TraitNodeType::Selection)
- return std::ranges::any_of(node->Entries, nodeEntryMatches);
-
- return std::ranges::all_of(node->Entries, nodeEntryMatches);
- };
-
- Optional<std::map<int32, int32>> spentCurrencies;
- FillSpentCurrenciesMap(traitConfig, spentCurrencies.emplace());
-
- auto meetsConditions = [&](std::vector<TraitCondEntry const*> const& conditions)
- {
- bool hasConditions = false;
- for (TraitCondEntry const* condition : conditions)
- {
- if (condition->GetCondType() == TraitConditionType::Available || condition->GetCondType() == TraitConditionType::Visible)
- {
- if (MeetsTraitCondition(traitConfig, player, condition, spentCurrencies))
- return true;
-
- hasConditions = true;
- }
- }
-
- return !hasConditions;
- };
-
- for (WorldPackets::Traits::TraitEntry const& traitEntry : traitConfig.Entries)
- {
- if (!IsValidEntry(traitEntry))
- return LearnResult::Unknown;
-
- Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, traitEntry.TraitNodeID);
- if (node->Data->GetType() == TraitNodeType::Selection)
- if (getNodeEntryCount(traitEntry.TraitNodeID) != 1)
- return LearnResult::Unknown;
-
- for (NodeEntry const& entry : node->Entries)
- if (!meetsConditions(entry.Conditions))
- return LearnResult::Unknown;
-
- if (!meetsConditions(node->Conditions))
- return LearnResult::Unknown;
-
- for (NodeGroup const* group : node->Groups)
- if (!meetsConditions(group->Conditions))
- return LearnResult::Unknown;
-
- if (!node->ParentNodes.empty())
- {
- bool hasAnyParentTrait = false;
- for (auto const& [parentNode, edgeType] : node->ParentNodes)
- {
- if (!isNodeFullyFilled(parentNode))
- {
- if (edgeType == TraitEdgeType::RequiredForAvailability)
- return LearnResult::NotEnoughTalentsInPrimaryTree;
-
- continue;
- }
-
- hasAnyParentTrait = true;
- }
-
- if (!hasAnyParentTrait)
- return LearnResult::NotEnoughTalentsInPrimaryTree;
- }
- }
-
- std::map<int32, int32> grantedCurrencies;
- FillOwnedCurrenciesMap(traitConfig, player, grantedCurrencies);
-
- for (auto [traitCurrencyId, spentAmount] : *spentCurrencies)
- {
- if (sTraitCurrencyStore.AssertEntry(traitCurrencyId)->GetType() != TraitCurrencyType::TraitSourced)
- continue;
-
- if (!spentAmount)
- continue;
-
- int32* grantedCount = Trinity::Containers::MapGetValuePtr(grantedCurrencies, traitCurrencyId);
- if (!grantedCount || *grantedCount < spentAmount)
- return LearnResult::NotEnoughTalentsInPrimaryTree;
- }
-
- if (requireSpendingAllCurrencies && traitConfig.Type == TraitConfigType::Combat)
- {
- for (auto [traitCurrencyId, grantedAmount] : grantedCurrencies)
- {
- if (!grantedAmount)
- continue;
-
- int32* spentAmount = Trinity::Containers::MapGetValuePtr(*spentCurrencies, traitCurrencyId);
- if (!spentAmount || *spentAmount != grantedAmount)
- return LearnResult::UnspentTalentPoints;
- }
- }
-
- return LearnResult::Ok;
-}
-
-std::vector<TraitDefinitionEffectPointsEntry const*> const* GetTraitDefinitionEffectPointModifiers(int32 traitDefinitionId)
-{
- return Trinity::Containers::MapGetValuePtr(_traitDefinitionEffectPointModifiers, traitDefinitionId);
-}
-
-void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig, PlayerDataAccessor player)
-{
- traitConfig.Entries.clear();
- std::vector<Tree const*> const* trees = GetTreesForConfig(traitConfig);
- if (!trees)
- return;
-
- for (UF::TraitEntry const& grant : GetGrantedTraitEntriesForConfig(traitConfig, player))
- {
- WorldPackets::Traits::TraitEntry& newEntry = traitConfig.Entries.emplace_back();
- newEntry.TraitNodeID = grant.TraitNodeID;
- newEntry.TraitNodeEntryID = grant.TraitNodeEntryID;
- newEntry.GrantedRanks = grant.GrantedRanks;
- }
-
- std::map<int32, int32> currencies;
- FillOwnedCurrenciesMap(traitConfig, player, currencies);
-
- if (std::vector<TraitTreeLoadoutEntryEntry const*> const* loadoutEntries = Trinity::Containers::MapGetValuePtr(_traitTreeLoadoutsByChrSpecialization, traitConfig.ChrSpecializationID))
- {
- auto findEntry = [](WorldPackets::Traits::TraitConfig& config, int32 traitNodeId, int32 traitNodeEntryId) -> WorldPackets::Traits::TraitEntry*
- {
- auto entryItr = std::ranges::find_if(config.Entries, [=](WorldPackets::Traits::TraitEntry const& traitEntry)
- {
- return traitEntry.TraitNodeID == traitNodeId && traitEntry.TraitNodeEntryID == traitNodeEntryId;
- });
- return entryItr != config.Entries.end() ? &*entryItr : nullptr;
- };
-
- for (TraitTreeLoadoutEntryEntry const* loadoutEntry : *loadoutEntries)
- {
- int32 addedRanks = loadoutEntry->NumPoints;
- Node const* node = Trinity::Containers::MapGetValuePtr(_traitNodes, loadoutEntry->SelectedTraitNodeID);
-
- WorldPackets::Traits::TraitEntry newEntry;
- newEntry.TraitNodeID = loadoutEntry->SelectedTraitNodeID;
- newEntry.TraitNodeEntryID = loadoutEntry->SelectedTraitNodeEntryID;
- if (!newEntry.TraitNodeEntryID)
- newEntry.TraitNodeEntryID = node->Entries[0].Data->ID;
-
- WorldPackets::Traits::TraitEntry* entryInConfig = findEntry(traitConfig, newEntry.TraitNodeID, newEntry.TraitNodeEntryID);
-
- if (entryInConfig)
- addedRanks -= entryInConfig->Rank;
-
- newEntry.Rank = addedRanks;
-
- if (!HasEnoughCurrency(newEntry, currencies))
- continue;
-
- if (entryInConfig)
- entryInConfig->Rank += addedRanks;
- else
- traitConfig.Entries.push_back(newEntry);
-
- TakeCurrencyCost(newEntry, currencies);
- }
- }
-}
-}
diff --git a/src/server/game/Spells/TraitMgr.h b/src/server/game/Spells/TraitMgr.h
deleted file mode 100644
index 951d4e39e90..00000000000
--- a/src/server/game/Spells/TraitMgr.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TRINITY_TRAIT_MGR_H
-#define TRINITY_TRAIT_MGR_H
-
-#include "Define.h"
-#include <map>
-#include <vector>
-
-class Player;
-struct TraitDefinitionEffectPointsEntry;
-enum class TraitConfigType : int32;
-enum TalentLearnResult : int32;
-
-namespace UF
-{
-struct TraitEntry;
-}
-
-namespace WorldPackets::Traits
-{
-struct TraitConfig;
-struct TraitEntry;
-}
-
-namespace TraitMgr
-{
-constexpr uint32 COMMIT_COMBAT_TRAIT_CONFIG_CHANGES_SPELL_ID = 384255u;
-constexpr uint32 MAX_COMBAT_TRAIT_CONFIGS = 10u;
-
-enum class LearnResult : int32
-{
- Ok = 0,
- Unknown = 1,
- NotEnoughTalentsInPrimaryTree = 2,
- NoPrimaryTreeSelected = 3,
- CantDoThatRightNow = 4,
- AffectingCombat = 5,
- CantRemoveTalent = 6,
- CantDoThatChallengeModeActive = 7,
- RestArea = 8,
- UnspentTalentPoints = 9,
- InPvpMatch = 10
-};
-
-struct PlayerDataAccessor
-{
- /*implicit*/ PlayerDataAccessor(Player const* player) : _player(player) { }
-
- uint64 GetMoney() const;
- int32 GetCurrencyQuantity(int32 currencyId) const;
- int32 GetLevel() const;
- bool IsQuestRewarded(int32 questId) const;
- bool HasAchieved(int32 achievementId) const;
- uint32 GetPrimarySpecialization() const;
-
-private:
- Player const* _player;
-};
-
-void Load();
-int32 GenerateNewTraitConfigId();
-TraitConfigType GetConfigTypeForTree(int32 traitTreeId);
-void FillSpentCurrenciesMap(WorldPackets::Traits::TraitEntry const& entry, std::map<int32, int32>& cachedCurrencies);
-std::vector<UF::TraitEntry> GetGrantedTraitEntriesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player);
-bool IsValidEntry(WorldPackets::Traits::TraitEntry const& traitEntry);
-LearnResult ValidateConfig(WorldPackets::Traits::TraitConfig const& traitConfig, PlayerDataAccessor player, bool requireSpendingAllCurrencies = false);
-std::vector<TraitDefinitionEffectPointsEntry const*> const* GetTraitDefinitionEffectPointModifiers(int32 traitDefinitionId);
-void InitializeStarterBuildTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig, PlayerDataAccessor player);
-}
-
-#endif // TRINITY_TRAIT_MGR_H
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 60b4a29d711..a9dc0b85161 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -92,7 +92,6 @@
#include "SupportMgr.h"
#include "TaxiPathGraph.h"
#include "TerrainMgr.h"
-#include "TraitMgr.h"
#include "TransportMgr.h"
#include "Unit.h"
#include "UpdateTime.h"
@@ -1892,9 +1891,6 @@ bool World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading Spell Totem models...");
sSpellMgr->LoadSpellTotemModel();
- TC_LOG_INFO("server.loading", "Loading Traits...");
- TraitMgr::Load();
-
TC_LOG_INFO("server.loading", "Loading languages..."); // must be after LoadSpellInfoStore and LoadSkillLineAbilityMap
sLanguageMgr->LoadLanguages();