aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-04-12 00:18:20 +0200
committerShauren <shauren.trinity@gmail.com>2024-04-12 00:18:20 +0200
commit69da702b930d43738bcaf49ce57b333dfc19ecfd (patch)
tree697d5a303ce10d25ea6e631cc4012c3ff3734c81 /src/server/game/Entities/Player
parent8c274a8e8d496bf2ac1beafd31e0967e6659f967 (diff)
Core/Items: Implemented CreateTime item field and changed refund/soulbound trade timers to also count time offline
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp58
1 files changed, 31 insertions, 27 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 50e5c2bcc71..77dea9acdf8 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -3924,7 +3924,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
do
{
Field* fields = resultItems->Fetch();
- uint64 mailId = fields[44].GetUInt64();
+ uint64 mailId = fields[53].GetUInt64();
if (Item* mailItem = _LoadMailedItem(playerguid, nullptr, mailId, nullptr, fields, Trinity::Containers::MapGetValuePtr(additionalData, fields[0].GetUInt64())))
itemsByMail[mailId].push_back(mailItem);
@@ -11545,19 +11545,19 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat
if (bonusListIDs)
item->SetBonuses(*bonusListIDs);
+ item->SetFixedLevel(GetLevel());
+ item->SetItemRandomBonusList(randomBonusListId);
+ item->SetCreatePlayedTime(GetTotalPlayedTime());
+
item = StoreItem(pos, item, update);
ItemAddedQuestCheck(itemId, count, false);
UpdateCriteria(CriteriaType::ObtainAnyItem, itemId, count);
UpdateCriteria(CriteriaType::AcquireItem, itemId, count);
- item->SetFixedLevel(GetLevel());
- item->SetItemRandomBonusList(randomBonusListId);
-
if (allowedLooters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
{
item->SetSoulboundTradeable(allowedLooters);
- item->SetCreatePlayedTime(GetTotalPlayedTime());
AddTradeableItem(item);
// save data
@@ -18804,19 +18804,23 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti
PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult,
PreparedQueryResult azeriteEmpoweredItemResult, uint32 timeDiff)
{
- // 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,
- // 13 14 15 16 17 18
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13
+ // SELECT guid, itemEntry, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, createTime, text,
+ // 14 15 16 17 18 19
// 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
+ // 20 21 22 23 24 25
+ // itemModifiedAppearanceAllSpecs, itemModifiedAppearanceSpec1, itemModifiedAppearanceSpec2, itemModifiedAppearanceSpec3, itemModifiedAppearanceSpec4, itemModifiedAppearanceSpec5,
+ // 26 27 28 29 30 31
+ // spellItemEnchantmentAllSpecs, spellItemEnchantmentSpec1, spellItemEnchantmentSpec2, spellItemEnchantmentSpec3, spellItemEnchantmentSpec4, spellItemEnchantmentSpec5,
+ // 32 33 34
+ // secondaryItemModifiedAppearanceAllSpecs, secondaryItemModifiedAppearanceSpec1, secondaryItemModifiedAppearanceSpec2,
+ // 35 36 37
+ // secondaryItemModifiedAppearanceSpec3, secondaryItemModifiedAppearanceSpec4, secondaryItemModifiedAppearanceSpec5,
+ // 38 39 40 41 42 43 44 45 46 47 48 49
// gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3
- // 41 42
+ // 50 51
// fixedScalingLevel, artifactKnowledgeLevel FROM item_instance
- // 43 44
+ // 52 53
// bag, slot
// FROM character_inventory ci
// JOIN item_instance ii ON ci.item = ii.guid
@@ -18867,8 +18871,8 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti
azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(this, *addionalDataPtr->AzeriteEmpoweredItem);
}
- ObjectGuid bagGuid = fields[51].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[51].GetUInt64()) : ObjectGuid::Empty;
- uint8 slot = fields[52].GetUInt8();
+ ObjectGuid bagGuid = fields[52].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[52].GetUInt64()) : ObjectGuid::Empty;
+ uint8 slot = fields[53].GetUInt8();
GetSession()->GetCollectionMgr()->CheckHeirloomUpgrades(item);
GetSession()->GetCollectionMgr()->AddItemAppearance(item);
@@ -19082,10 +19086,10 @@ Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint3
}
else if (item->IsRefundable())
{
- if (item->GetPlayedTime() > (2 * HOUR))
+ if (item->IsRefundExpired())
{
TC_LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
- GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetPlayedTime());
+ GetGUID().ToString(), GetName(), item->GetGUID().ToString(), GetTotalPlayedTime() - item->GetPlayedTime());
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
stmt->setUInt64(0, item->GetGUID().GetCounter());
@@ -19208,7 +19212,7 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint
Item* item = NewItemOrBag(proto);
- ObjectGuid ownerGuid = fields[51].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[51].GetUInt64()) : ObjectGuid::Empty;
+ ObjectGuid ownerGuid = fields[52].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[52].GetUInt64()) : ObjectGuid::Empty;
if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
{
TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
@@ -19297,7 +19301,7 @@ void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mail
do
{
Field* fields = mailItemsResult->Fetch();
- uint64 mailId = fields[52].GetUInt64();
+ uint64 mailId = fields[53].GetUInt64();
_LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields, Trinity::Containers::MapGetValuePtr(additionalData, fields[0].GetUInt64()));
} while (mailItemsResult->NextRow());
}
@@ -20599,10 +20603,10 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans)
i_next = itr;
++i_next;
- Item* iPtr = GetItemByGuid(*itr);
- if (iPtr)
+ if (Item* iPtr = GetItemByGuid(*itr))
{
- iPtr->UpdatePlayedTime(this);
+ if (iPtr->IsRefundable() && iPtr->IsRefundExpired())
+ iPtr->SetNotRefundable(this);
continue;
}
else
@@ -28609,8 +28613,8 @@ void Player::DeleteRefundReference(ObjectGuid it)
void Player::SendRefundInfo(Item* item)
{
- // This function call unsets ITEM_FIELD_FLAG_REFUNDABLE if played time is over 2 hours.
- item->UpdatePlayedTime(this);
+ if (item->IsRefundable() && item->IsRefundExpired())
+ item->SetNotRefundable(this);
if (!item->IsRefundable())
{
@@ -28634,7 +28638,7 @@ void Player::SendRefundInfo(Item* item)
WorldPackets::Item::SetItemPurchaseData setItemPurchaseData;
setItemPurchaseData.ItemGUID = item->GetGUID();
- setItemPurchaseData.PurchaseTime = GetTotalPlayedTime() - item->GetPlayedTime();
+ setItemPurchaseData.PurchaseTime = item->m_itemData->CreatePlayedTime;
setItemPurchaseData.Contents.Money = item->GetPaidMoney();
for (uint8 i = 0; i < MAX_ITEM_EXT_COST_ITEMS; ++i) // item cost data