diff options
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(); |