diff options
-rw-r--r-- | sql/base/characters_database.sql | 11 | ||||
-rw-r--r-- | sql/updates/characters/master/2021_08_11_00_characters.sql | 35 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 10 | ||||
-rw-r--r-- | src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 87 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildMgr.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Handlers/TransmogrificationHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.h | 2 |
14 files changed, 157 insertions, 60 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index a800bb96f9e..ff3a018dc39 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -3193,11 +3193,19 @@ CREATE TABLE `item_instance_transmog` ( `itemModifiedAppearanceSpec2` int(11) NOT NULL DEFAULT '0', `itemModifiedAppearanceSpec3` int(11) NOT NULL DEFAULT '0', `itemModifiedAppearanceSpec4` int(11) NOT NULL DEFAULT '0', + `itemModifiedAppearanceSpec5` int(11) NOT NULL DEFAULT '0', `spellItemEnchantmentAllSpecs` int(11) NOT NULL DEFAULT '0', `spellItemEnchantmentSpec1` int(11) NOT NULL DEFAULT '0', `spellItemEnchantmentSpec2` int(11) NOT NULL DEFAULT '0', `spellItemEnchantmentSpec3` int(11) NOT NULL DEFAULT '0', `spellItemEnchantmentSpec4` int(11) NOT NULL DEFAULT '0', + `spellItemEnchantmentSpec5` int(11) NOT NULL DEFAULT '0', + `secondaryItemModifiedAppearanceAllSpecs` int(11) NOT NULL DEFAULT '0', + `secondaryItemModifiedAppearanceSpec1` int(11) NOT NULL DEFAULT '0', + `secondaryItemModifiedAppearanceSpec2` int(11) NOT NULL DEFAULT '0', + `secondaryItemModifiedAppearanceSpec3` int(11) NOT NULL DEFAULT '0', + `secondaryItemModifiedAppearanceSpec4` int(11) NOT NULL DEFAULT '0', + `secondaryItemModifiedAppearanceSpec5` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`itemGuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3858,7 +3866,8 @@ INSERT INTO `updates` VALUES ('2021_04_05_00_characters.sql','33D656995E0F3578FFE1A658ED1692CA5310AB30','ARCHIVED','2021-04-05 23:44:54',0), ('2021_05_10_00_characters.sql','0A406242BC18BDA5A65CDE3E2AFEE760D79F819F','ARCHIVED','2021-05-10 23:30:34',0), ('2021_05_11_00_characters.sql','C3F0337CE8363F970AB4FDB9D23BBB7C650A0B0E','ARCHIVED','2021-05-11 15:39:26',0), -('2021_07_04_00_characters.sql','E0E7AD664DDB553E96B457DD9ED8976665E94007','ARCHIVED','2021-07-04 22:23:24',0); +('2021_07_04_00_characters.sql','E0E7AD664DDB553E96B457DD9ED8976665E94007','ARCHIVED','2021-07-04 22:23:24',0), +('2021_08_11_00_characters.sql','2137A52A45B045104B97D39626CE3C0214625B17','RELEASED','2021-08-11 21:48:57',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2021_08_11_00_characters.sql b/sql/updates/characters/master/2021_08_11_00_characters.sql new file mode 100644 index 00000000000..dd9b840a333 --- /dev/null +++ b/sql/updates/characters/master/2021_08_11_00_characters.sql @@ -0,0 +1,35 @@ +UPDATE `characters` SET `equipmentCache`=CONCAT( +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -93), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -89), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -85), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -81), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -77), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -73), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -69), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -65), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -61), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -57), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -53), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -49), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -45), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -41), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -37), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -33), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -29), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -25), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -21), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -17), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -13), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -9), ' ', 4), ' 0 '), +CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -5), ' ', 4), ' 0 ') +) WHERE LENGTH(`equipmentCache`) > 0; + +ALTER TABLE `item_instance_transmog` + ADD `itemModifiedAppearanceSpec5` int(11) NOT NULL DEFAULT '0' AFTER `itemModifiedAppearanceSpec4`, + ADD `spellItemEnchantmentSpec5` int(11) NOT NULL DEFAULT '0' AFTER `spellItemEnchantmentSpec4`, + ADD `secondaryItemModifiedAppearanceAllSpecs` int(11) NOT NULL DEFAULT '0' AFTER `spellItemEnchantmentSpec5`, + ADD `secondaryItemModifiedAppearanceSpec1` int(11) NOT NULL DEFAULT '0' AFTER `secondaryItemModifiedAppearanceAllSpecs`, + ADD `secondaryItemModifiedAppearanceSpec2` int(11) NOT NULL DEFAULT '0' AFTER `secondaryItemModifiedAppearanceSpec1`, + ADD `secondaryItemModifiedAppearanceSpec3` int(11) NOT NULL DEFAULT '0' AFTER `secondaryItemModifiedAppearanceSpec2`, + ADD `secondaryItemModifiedAppearanceSpec4` int(11) NOT NULL DEFAULT '0' AFTER `secondaryItemModifiedAppearanceSpec3`, + ADD `secondaryItemModifiedAppearanceSpec5` int(11) NOT NULL DEFAULT '0' AFTER `secondaryItemModifiedAppearanceSpec4`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index ed6a1920a6c..7ce13e182f6 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -25,8 +25,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() #define SelectItemInstanceContent "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomBonusListId, " \ "ii.durability, ii.playedTime, ii.text, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " \ - "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " \ - "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " \ + "iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, iit.itemModifiedAppearanceSpec5, " \ + "iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, iit.spellItemEnchantmentSpec5, " \ + "iit.secondaryItemModifiedAppearanceAllSpecs, iit.secondaryItemModifiedAppearanceSpec1, iit.secondaryItemModifiedAppearanceSpec2, iit.secondaryItemModifiedAppearanceSpec3, iit.secondaryItemModifiedAppearanceSpec4, iit.itemModifiedAppearanceSpec5, " \ "ig.gemItemId1, ig.gemBonuses1, ig.gemContext1, ig.gemScalingLevel1, ig.gemItemId2, ig.gemBonuses2, ig.gemContext2, ig.gemScalingLevel2, ig.gemItemId3, ig.gemBonuses3, ig.gemContext3, ig.gemScalingLevel3, " \ "im.fixedScalingLevel, im.artifactKnowledgeLevel" @@ -201,8 +202,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS, "DELETE FROM item_instance_gems WHERE itemGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_GEMS_BY_OWNER, "DELETE iig FROM item_instance_gems iig LEFT JOIN item_instance ii ON iig.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_ITEM_INSTANCE_TRANSMOG, "INSERT INTO item_instance_transmog (itemGuid, itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, " - "spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_ITEM_INSTANCE_TRANSMOG, "INSERT INTO item_instance_transmog (itemGuid, itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, itemModifiedAppearanceSpec5, " + "spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, spellItemEnchantmentSpec5, " + "secondaryItemModifiedAppearanceAllSpecs, secondaryItemModifiedAppearanceSpec1, secondaryItemModifiedAppearanceSpec2, secondaryItemModifiedAppearanceSpec3, secondaryItemModifiedAppearanceSpec4, secondaryItemModifiedAppearanceSpec5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG, "DELETE FROM item_instance_transmog WHERE itemGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG_BY_OWNER, "DELETE iit FROM item_instance_transmog iit LEFT JOIN item_instance ii ON iit.itemGuid = ii.guid WHERE ii.owner_guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_ITEM_INSTANCE_ARTIFACT, "SELECT a.itemGuid, a.xp, a.artifactAppearanceId, a.artifactTierId, ap.artifactPowerId, ap.purchasedRank FROM item_instance_artifact_powers ap LEFT JOIN item_instance_artifact a ON ap.itemGuid = a.itemGuid INNER JOIN character_inventory ci ON ci.item = ap.itemGuid WHERE ci.guid = ?", CONNECTION_ASYNC); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 7c9fc644d13..6dbd0aab744 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -555,12 +555,12 @@ void AuctionHouseMgr::LoadAuctions() } Item* item = NewItemOrBag(proto); - if (!item->LoadFromDB(itemGuid, ObjectGuid::Create<HighGuid::Player>(fields[43].GetUInt64()), fields, itemEntry)) + if (!item->LoadFromDB(itemGuid, ObjectGuid::Create<HighGuid::Player>(fields[51].GetUInt64()), fields, itemEntry)) { delete item; continue; } - uint32 auctionId = fields[44].GetUInt32(); + uint32 auctionId = fields[52].GetUInt32(); itemsByAuction[auctionId].push_back(item); ++count; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 3cd6b003daa..fbbb94df1f1 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -641,19 +641,28 @@ void Item::SaveToDB(CharacterDatabaseTransaction& trans) trans->Append(stmt); } - static ItemModifier const transmogMods[10] = + static ItemModifier const transmogMods[18] = { ITEM_MODIFIER_TRANSMOG_APPEARANCE_ALL_SPECS, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_1, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, + ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_5, ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, + ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_5, + + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_ALL_SPECS, + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_1, + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_2, + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_3, + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4, + ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_5 }; stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_TRANSMOG); @@ -669,11 +678,19 @@ void Item::SaveToDB(CharacterDatabaseTransaction& trans) stmt->setUInt32(3, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2)); stmt->setUInt32(4, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3)); stmt->setUInt32(5, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4)); - stmt->setUInt32(6, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); - stmt->setUInt32(7, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1)); - stmt->setUInt32(8, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2)); - stmt->setUInt32(9, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3)); - stmt->setUInt32(10, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4)); + stmt->setUInt32(6, GetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_5)); + stmt->setUInt32(7, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS)); + stmt->setUInt32(8, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1)); + stmt->setUInt32(9, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2)); + stmt->setUInt32(10, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3)); + stmt->setUInt32(11, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4)); + stmt->setUInt32(12, GetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_5)); + stmt->setUInt32(13, GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_ALL_SPECS)); + stmt->setUInt32(14, GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_1)); + stmt->setUInt32(15, GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_2)); + stmt->setUInt32(16, GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_3)); + stmt->setUInt32(17, GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4)); + stmt->setUInt32(18, GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_5)); trans->Append(stmt); } @@ -784,13 +801,17 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, // 13 14 15 16 17 18 // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, - // 19 20 21 22 23 - // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, - // 24 25 26 27 28 - // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 29 30 31 32 33 34 35 36 37 38 39 40 + // 19 20 21 22 23 24 + // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, itemModifiedAppearanceSpec5, + // 25 26 27 28 29 30 + // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, spellItemEnchantmentSpec5, + // 31 32 33 + // secondaryItemModifiedAppearanceAllSpecs, secondaryItemModifiedAppearanceSpec1, secondaryItemModifiedAppearanceSpec2, + // 34 35 36 + // secondaryItemModifiedAppearanceSpec3, secondaryItemModifiedAppearanceSpec4, secondaryItemModifiedAppearanceSpec5, + // 37 38 39 40 41 42 43 44 45 46 47 48 // gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3 - // 41 42 + // 49 50 // fixedScalingLevel, artifactKnowledgeLevel FROM item_instance // create item before any checks for store correct guid @@ -874,32 +895,41 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_2, fields[21].GetUInt32()); SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_3, fields[22].GetUInt32()); SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_4, fields[23].GetUInt32()); - - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, fields[24].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, fields[25].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, fields[26].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, fields[27].GetUInt32()); - SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, fields[28].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_SPEC_5, fields[24].GetUInt32()); + + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_ALL_SPECS, fields[25].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_1, fields[26].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_2, fields[27].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_3, fields[28].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_4, fields[29].GetUInt32()); + SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION_SPEC_5, fields[30].GetUInt32()); + + SetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_ALL_SPECS, fields[31].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_1, fields[32].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_2, fields[33].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_3, fields[34].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_4, fields[35].GetUInt32()); + SetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_SPEC_5, fields[36].GetUInt32()); uint32 const gemFields = 4; ItemDynamicFieldGems gemData[MAX_GEM_SOCKETS]; memset(gemData, 0, sizeof(gemData)); for (uint32 i = 0; i < MAX_GEM_SOCKETS; ++i) { - gemData[i].ItemId = fields[29 + i * gemFields].GetUInt32(); - Tokenizer gemBonusListIDs(fields[30 + i * gemFields].GetString(), ' '); + gemData[i].ItemId = fields[37 + i * gemFields].GetUInt32(); + Tokenizer gemBonusListIDs(fields[38 + i * gemFields].GetString(), ' '); uint32 b = 0; for (char const* token : gemBonusListIDs) if (uint32 bonusListID = atoul(token)) gemData[i].BonusListIDs[b++] = bonusListID; - gemData[i].Context = fields[31 + i * gemFields].GetUInt8(); + gemData[i].Context = fields[39 + i * gemFields].GetUInt8(); if (gemData[i].ItemId) - SetGem(i, &gemData[i], fields[32 + i * gemFields].GetUInt32()); + SetGem(i, &gemData[i], fields[40 + i * gemFields].GetUInt32()); } - SetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL, fields[41].GetUInt32()); - SetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, fields[42].GetUInt32()); + SetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL, fields[49].GetUInt32()); + SetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, fields[50].GetUInt32()); // Enchants must be loaded after all other bonus/scaling data Tokenizer enchantmentTokens(fields[8].GetString(), ' '); @@ -2354,6 +2384,15 @@ uint16 Item::GetVisibleAppearanceModId(Player const* owner) const return uint16(GetAppearanceModId()); } +int32 Item::GetVisibleSecondaryModifiedAppearanceId(Player const* owner) const +{ + uint32 itemModifiedAppearanceId = GetModifier(SecondaryAppearanceModifierSlotBySpec[owner->GetActiveTalentGroup()]); + if (!itemModifiedAppearanceId) + itemModifiedAppearanceId = GetModifier(ITEM_MODIFIER_TRANSMOG_SECONDARY_APPEARANCE_ALL_SPECS); + + return itemModifiedAppearanceId; +} + uint32 Item::GetVisibleEnchantmentId(Player const* owner) const { uint32 enchantmentId = GetModifier(IllusionModifierSlotBySpec[owner->GetActiveTalentGroup()]); diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index d2b3bb702ae..3c5bf046f90 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -395,6 +395,7 @@ class TC_GAME_API Item : public Object uint32 GetVisibleEntry(Player const* owner) const; uint16 GetVisibleAppearanceModId(Player const* owner) const; + int32 GetVisibleSecondaryModifiedAppearanceId(Player const* owner) const; uint32 GetVisibleEnchantmentId(Player const* owner) const; uint16 GetVisibleItemVisual(Player const* owner) const; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 55ae7da41aa..3bdf20610a7 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -868,7 +868,7 @@ bool UnitChannel::operator==(UnitChannel const& right) const void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const { data << int32(ItemID); - data << int32(ItemModifiedAppearanceID); + data << int32(SecondaryItemModifiedAppearanceID); data << uint16(ItemAppearanceModID); data << uint16(ItemVisual); } @@ -890,7 +890,7 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con } if (changesMask[2]) { - data << int32(ItemModifiedAppearanceID); + data << int32(SecondaryItemModifiedAppearanceID); } if (changesMask[3]) { @@ -906,7 +906,7 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con void VisibleItem::ClearChangesMask() { Base::ClearChangesMask(ItemID); - Base::ClearChangesMask(ItemModifiedAppearanceID); + Base::ClearChangesMask(SecondaryItemModifiedAppearanceID); Base::ClearChangesMask(ItemAppearanceModID); Base::ClearChangesMask(ItemVisual); _changesMask.ResetAll(); diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 5c3f61e5fae..ab78d91b374 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -232,7 +232,7 @@ struct UnitChannel : public IsUpdateFieldStructureTag struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<5> { UpdateField<int32, 0, 1> ItemID; - UpdateField<int32, 0, 2> ItemModifiedAppearanceID; + UpdateField<int32, 0, 2> SecondaryItemModifiedAppearanceID; UpdateField<uint16, 0, 3> ItemAppearanceModID; UpdateField<uint16, 0, 4> ItemVisual; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6d606e3c647..0bd004d04f7 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -12488,12 +12488,14 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem) if (pItem) { SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemID), pItem->GetVisibleEntry(this)); + SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::SecondaryItemModifiedAppearanceID), pItem->GetVisibleSecondaryModifiedAppearanceId(this)); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemAppearanceModID), pItem->GetVisibleAppearanceModId(this)); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemVisual), pItem->GetVisibleItemVisual(this)); } else { SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemID), 0); + SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::SecondaryItemModifiedAppearanceID), 0); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemAppearanceModID), 0); SetUpdateFieldValue(itemField.ModifyValue(&UF::VisibleItem::ItemVisual), 0); } @@ -18870,8 +18872,8 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(this, *addionalDataPtr->AzeriteEmpoweredItem); } - ObjectGuid bagGuid = fields[43].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[43].GetUInt64()) : ObjectGuid::Empty; - uint8 slot = fields[44].GetUInt8(); + ObjectGuid bagGuid = fields[51].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[51].GetUInt64()) : ObjectGuid::Empty; + uint8 slot = fields[52].GetUInt8(); GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item); GetSession()->GetCollectionMgr()->AddItemAppearance(item); @@ -19213,7 +19215,7 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint Item* item = NewItemOrBag(proto); - ObjectGuid ownerGuid = fields[43].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[43].GetUInt64()) : ObjectGuid::Empty; + ObjectGuid ownerGuid = fields[51].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[51].GetUInt64()) : ObjectGuid::Empty; if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry)) { TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: " UI64FMTD ") in mail (%u) doesn't exist, deleted from mail.", itemGuid, mailId); @@ -19344,7 +19346,7 @@ void Player::_LoadMail() do { Field* fields = result->Fetch(); - uint32 mailId = fields[44].GetUInt32(); + uint32 mailId = fields[52].GetUInt32(); _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields, Trinity::Containers::MapGetValuePtr(additionalData, fields[0].GetUInt64())); } while (result->NextRow()); @@ -20397,10 +20399,12 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba else ss << '0'; - ss << ' ' << uint32(sItemStore.AssertEntry(item->GetVisibleEntry(this))->SubclassID) << ' '; + ss << ' ' + << uint32(sItemStore.AssertEntry(item->GetVisibleEntry(this))->SubclassID) << ' ' + << uint32(item->GetVisibleSecondaryModifiedAppearanceId(this)) << ' '; } else - ss << "0 0 0 0 "; + ss << "0 0 0 0 0 "; } stmt->setString(index++, ss.str()); @@ -20540,10 +20544,12 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba else ss << '0'; - ss << ' ' << uint32(sItemStore.AssertEntry(item->GetVisibleEntry(this))->SubclassID) << ' '; + ss << ' ' + << uint32(sItemStore.AssertEntry(item->GetVisibleEntry(this))->SubclassID) << ' ' + << uint32(item->GetVisibleSecondaryModifiedAppearanceId(this)) << ' '; } else - ss << "0 0 0 0 "; + ss << "0 0 0 0 0 "; } stmt->setString(index++, ss.str()); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 6b41a72969c..a28f4b5baf2 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -376,7 +376,7 @@ void Guild::BankTab::LoadFromDB(Field* fields) bool Guild::BankTab::LoadItemFromDB(Field* fields) { - uint8 slotId = fields[45].GetUInt8(); + uint8 slotId = fields[53].GetUInt8(); ObjectGuid::LowType itemGuid = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); if (slotId >= GUILD_BANK_MAX_SLOTS) @@ -2510,7 +2510,7 @@ void Guild::LoadBankTabFromDB(Field* fields) bool Guild::LoadBankItemFromDB(Field* fields) { - uint8 tabId = fields[44].GetUInt8(); + uint8 tabId = fields[52].GetUInt8(); if (tabId >= _GetPurchasedTabsSize()) { TC_LOG_ERROR("guild", "Invalid tab for item (GUID: %u, id: #%u) in guild bank, skipped.", diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index b2b4169f173..e7ac7df19c0 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -408,19 +408,23 @@ void GuildMgr::LoadGuilds() // Delete orphan guild bank items CharacterDatabase.DirectExecute("DELETE gbi FROM guild_bank_item gbi LEFT JOIN guild g ON gbi.guildId = g.guildId WHERE g.guildId IS NULL"); - // 0 1 2 3 4 5 6 7 8 9 10 11 12 - // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, // 13 14 15 16 17 18 // battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, - // 19 20 21 22 23 - // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, - // 24 25 26 27 28 - // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, - // 29 30 31 32 33 34 35 36 37 38 39 40 + // 19 20 21 22 23 24 + // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, itemModifiedAppearanceSpec5, + // 25 26 27 28 29 30 + // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, spellItemEnchantmentSpec5, + // 31 32 33 + // secondaryItemModifiedAppearanceAllSpecs, secondaryItemModifiedAppearanceSpec1, secondaryItemModifiedAppearanceSpec2, + // 34 35 36 + // secondaryItemModifiedAppearanceSpec3, secondaryItemModifiedAppearanceSpec4, secondaryItemModifiedAppearanceSpec5, + // 37 38 39 40 41 42 43 44 45 46 47 48 // gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3 - // 41 42 + // 49 50 // fixedScalingLevel, artifactKnowledgeLevel - // 43 44 45 + // 51 52 53 // guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEMS)); @@ -434,7 +438,7 @@ void GuildMgr::LoadGuilds() do { Field* fields = result->Fetch(); - uint64 guildId = fields[43].GetUInt64(); + uint64 guildId = fields[51].GetUInt64(); if (Guild* guild = GetGuildById(guildId)) guild->LoadBankItemFromDB(fields); diff --git a/src/server/game/Handlers/TransmogrificationHandler.cpp b/src/server/game/Handlers/TransmogrificationHandler.cpp index 817c708aa2b..a82d85182bf 100644 --- a/src/server/game/Handlers/TransmogrificationHandler.cpp +++ b/src/server/game/Handlers/TransmogrificationHandler.cpp @@ -108,10 +108,10 @@ void WorldSession::HandleTransmogrifyItems(WorldPackets::Transmogrification::Tra if (transmogItem.ItemModifiedAppearanceID || transmogItem.SecondaryItemModifiedAppearanceID) { - if (!validateAndStoreTransmogItem(itemTransmogrified, transmogItem.ItemModifiedAppearanceID, false)) + if (transmogItem.ItemModifiedAppearanceID && !validateAndStoreTransmogItem(itemTransmogrified, transmogItem.ItemModifiedAppearanceID, false)) return; - if (!validateAndStoreTransmogItem(itemTransmogrified, transmogItem.SecondaryItemModifiedAppearanceID, true)) + if (transmogItem.SecondaryItemModifiedAppearanceID && !validateAndStoreTransmogItem(itemTransmogrified, transmogItem.SecondaryItemModifiedAppearanceID, true)) return; // add cost diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 23a2244d889..98a8199e104 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -142,11 +142,12 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { - uint32 visualBase = slot * 4; + uint32 visualBase = slot * 5; VisualItems[slot].InvType = Player::GetUInt32ValueFromArray(equipment, visualBase); VisualItems[slot].DisplayID = Player::GetUInt32ValueFromArray(equipment, visualBase + 1); VisualItems[slot].DisplayEnchantID = Player::GetUInt32ValueFromArray(equipment, visualBase + 2); VisualItems[slot].Subclass = Player::GetUInt32ValueFromArray(equipment, visualBase + 3); + VisualItems[slot].SecondaryItemModifiedAppearanceID = Player::GetUInt32ValueFromArray(equipment, visualBase + 4); } } @@ -154,7 +155,7 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo::Vi { data << uint32(visualItem.DisplayID); data << uint32(visualItem.DisplayEnchantID); - data << int32(visualItem.ItemModifiedAppearanceID); + data << int32(visualItem.SecondaryItemModifiedAppearanceID); data << uint8(visualItem.InvType); data << uint8(visualItem.Subclass); diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 00751706183..1d50331f6c8 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -154,7 +154,7 @@ namespace WorldPackets { uint32 DisplayID = 0; uint32 DisplayEnchantID = 0; - int32 ItemModifiedAppearanceID = 0; // also -1 is some special value + int32 SecondaryItemModifiedAppearanceID = 0; // also -1 is some special value uint8 InvType = 0; uint8 Subclass = 0; }; |