mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 17:05:44 +01:00
Core/Items: Item upgrade followup
* Fixed Item::SetModifier to broadcast value updates * Generate base item upgrade when looting * Generate base item upgrade when loading from db and db2 data changed
This commit is contained in:
@@ -161,7 +161,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, transmogrification, upgradeId, enchantIllusion, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, transmogrification = ?, upgradeId = ?, enchantIllusion = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_GIFT_OWNER, "UPDATE character_gifts SET guid = ? WHERE item_guid = ?", CONNECTION_ASYNC);
|
||||
|
||||
@@ -486,7 +486,23 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie
|
||||
SetModifier(ITEM_MODIFIER_TRANSMOG_APPEARANCE_MOD, (transmogEntry >> 24) & 0xFF);
|
||||
SetModifier(ITEM_MODIFIER_TRANSMOG_ITEM_ID, transmogEntry & 0xFFFFFF);
|
||||
}
|
||||
SetModifier(ITEM_MODIFIER_UPGRADE_ID, fields[14].GetUInt32());
|
||||
|
||||
uint32 upgradeId = fields[14].GetUInt32();
|
||||
ItemUpgradeEntry const* rulesetUpgrade = sItemUpgradeStore.LookupEntry(sDB2Manager.GetRulesetItemUpgrade(entry));
|
||||
ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(upgradeId);
|
||||
if (!rulesetUpgrade || !upgrade || rulesetUpgrade->ItemUpgradePathID != upgrade->ItemUpgradePathID)
|
||||
{
|
||||
upgradeId = 0;
|
||||
need_save = true;
|
||||
}
|
||||
|
||||
if (rulesetUpgrade && !upgradeId)
|
||||
{
|
||||
upgradeId = rulesetUpgrade->ID;
|
||||
need_save = true;
|
||||
}
|
||||
|
||||
SetModifier(ITEM_MODIFIER_UPGRADE_ID, upgradeId);
|
||||
SetModifier(ITEM_MODIFIER_ENCHANT_ILLUSION, fields[15].GetUInt32());
|
||||
SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[16].GetUInt32());
|
||||
SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[17].GetUInt32());
|
||||
@@ -506,6 +522,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie
|
||||
stmt->setUInt32(0, GetUInt32Value(ITEM_FIELD_DURATION));
|
||||
stmt->setUInt32(1, GetUInt32Value(ITEM_FIELD_FLAGS));
|
||||
stmt->setUInt32(2, GetUInt32Value(ITEM_FIELD_DURABILITY));
|
||||
stmt->setUInt32(3, GetModifier(ITEM_MODIFIER_UPGRADE_ID));
|
||||
stmt->setUInt64(3, guid);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
@@ -1848,6 +1865,9 @@ uint32 Item::GetItemLevel(Player const* owner) const
|
||||
if (uint32 heirloomIlvl = sDB2Manager.GetHeirloomItemLevel(ssd->ItemLevelCurveID, owner->getLevel()))
|
||||
itemLevel = heirloomIlvl;
|
||||
|
||||
if (ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(GetModifier(ITEM_MODIFIER_UPGRADE_ID)))
|
||||
itemLevel += upgrade->ItemLevelBonus;
|
||||
|
||||
return std::min(std::max(itemLevel + _bonusData.ItemLevel, uint32(MIN_ITEM_LEVEL)), uint32(MAX_ITEM_LEVEL));
|
||||
}
|
||||
|
||||
@@ -1877,6 +1897,12 @@ uint32 Item::GetDisplayId() const
|
||||
|
||||
void Item::SetModifier(ItemModifier modifier, uint32 value)
|
||||
{
|
||||
if (_modifiers[modifier] != value)
|
||||
{
|
||||
_dynamicChangesMask.SetBit(ITEM_DYNAMIC_FIELD_MODIFIERS);
|
||||
AddToObjectUpdateIfNeeded();
|
||||
}
|
||||
|
||||
_modifiers[modifier] = value;
|
||||
ApplyModFlag(ITEM_FIELD_MODIFIERS_MASK, 1 << modifier, value != 0);
|
||||
}
|
||||
|
||||
@@ -366,6 +366,7 @@ LootItem::LootItem(LootStoreItem const& li)
|
||||
|
||||
randomSuffix = GenerateEnchSuffixFactor(itemid);
|
||||
randomPropertyId = Item::GenerateItemRandomPropertyId(itemid);
|
||||
upgradeId = sDB2Manager.GetRulesetItemUpgrade(itemid);
|
||||
count = 0;
|
||||
is_looted = 0;
|
||||
is_blocked = 0;
|
||||
|
||||
@@ -159,6 +159,7 @@ struct TC_GAME_API LootItem
|
||||
uint32 itemid;
|
||||
uint32 randomSuffix;
|
||||
int32 randomPropertyId;
|
||||
int32 upgradeId;
|
||||
std::vector<int32> BonusListIDs;
|
||||
ConditionContainer conditions; // additional loot condition
|
||||
GuidSet allowedGUIDs;
|
||||
@@ -177,7 +178,7 @@ struct TC_GAME_API LootItem
|
||||
explicit LootItem(LootStoreItem const& li);
|
||||
|
||||
// Empty constructor for creating an empty LootItem to be filled in with DB data
|
||||
LootItem() : itemid(0), randomSuffix(0), randomPropertyId(0), count(0), is_looted(false), is_blocked(false),
|
||||
LootItem() : itemid(0), randomSuffix(0), randomPropertyId(0), upgradeId(0), count(0), is_looted(false), is_blocked(false),
|
||||
freeforall(false), is_underthreshold(false), is_counted(false), needs_quest(false), follow_loot_rules(false),
|
||||
canSave(true){ };
|
||||
|
||||
|
||||
@@ -280,7 +280,11 @@ void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem)
|
||||
ItemBonus->Context = 0; /// @todo
|
||||
}
|
||||
|
||||
/// no Modifications
|
||||
if (lootItem.upgradeId)
|
||||
{
|
||||
Modifications = boost::in_place();
|
||||
Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, lootItem.upgradeId);
|
||||
}
|
||||
}
|
||||
|
||||
void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem)
|
||||
|
||||
Reference in New Issue
Block a user