Core/Items: Implemented CreateTime item field and changed refund/soulbound trade timers to also count time offline
Port From (https://github.com/TrinityCore/TrinityCore/commit/69da702b930d43738bcaf49ce57b333dfc19ecfd)
This commit is contained in:
@@ -8,7 +8,7 @@ namespace Framework.Database
|
|||||||
public override void PreparedStatements()
|
public override void PreparedStatements()
|
||||||
{
|
{
|
||||||
const string SelectItemInstanceContent = "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomBonusListId, " +
|
const string 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, " +
|
"ii.durability, ii.playedTime, ii.createTime, 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.itemModifiedAppearanceSpec5, " +
|
"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.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, iit.spellItemEnchantmentSpec5, " +
|
||||||
"iit.secondaryItemModifiedAppearanceAllSpecs, iit.secondaryItemModifiedAppearanceSpec1, iit.secondaryItemModifiedAppearanceSpec2, iit.secondaryItemModifiedAppearanceSpec3, iit.secondaryItemModifiedAppearanceSpec4, iit.secondaryItemModifiedAppearanceSpec5, " +
|
"iit.secondaryItemModifiedAppearanceAllSpecs, iit.secondaryItemModifiedAppearanceSpec1, iit.secondaryItemModifiedAppearanceSpec2, iit.secondaryItemModifiedAppearanceSpec3, iit.secondaryItemModifiedAppearanceSpec4, iit.secondaryItemModifiedAppearanceSpec5, " +
|
||||||
@@ -182,8 +182,8 @@ namespace Framework.Database
|
|||||||
PrepareStatement(CharStatements.DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1");
|
PrepareStatement(CharStatements.DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1");
|
||||||
PrepareStatement(CharStatements.INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)");
|
PrepareStatement(CharStatements.INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)");
|
||||||
PrepareStatement(CharStatements.REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)");
|
PrepareStatement(CharStatements.REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)");
|
||||||
PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, createTime, text, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?");
|
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, createTime = ?, text = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?");
|
||||||
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?");
|
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?");
|
||||||
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?");
|
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?");
|
||||||
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?");
|
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?");
|
||||||
|
|||||||
@@ -164,13 +164,13 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
Item item = Item.NewItemOrBag(proto);
|
Item item = Item.NewItemOrBag(proto);
|
||||||
if (!item.LoadFromDB(itemGuid, ObjectGuid.Create(HighGuid.Player, result.Read<ulong>(51)), result.GetFields(), itemEntry))
|
if (!item.LoadFromDB(itemGuid, ObjectGuid.Create(HighGuid.Player, result.Read<ulong>(52)), result.GetFields(), itemEntry))
|
||||||
{
|
{
|
||||||
item.Dispose();
|
item.Dispose();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint auctionId = result.Read<uint>(52);
|
uint auctionId = result.Read<uint>(53);
|
||||||
itemsByAuction.Add(auctionId, item);
|
itemsByAuction.Add(auctionId, item);
|
||||||
|
|
||||||
++count;
|
++count;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ namespace Game.Entities
|
|||||||
|
|
||||||
uState = ItemUpdateState.New;
|
uState = ItemUpdateState.New;
|
||||||
uQueuePos = -1;
|
uQueuePos = -1;
|
||||||
m_lastPlayedTimeUpdate = GameTime.GetGameTime();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool Create(ulong guidlow, uint itemId, ItemContext context, Player owner)
|
public virtual bool Create(ulong guidlow, uint itemId, ItemContext context, Player owner)
|
||||||
@@ -59,6 +58,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
SetExpiration(itemProto.GetDuration());
|
SetExpiration(itemProto.GetDuration());
|
||||||
SetCreatePlayedTime(0);
|
SetCreatePlayedTime(0);
|
||||||
|
SetCreateTime(GameTime.GetGameTime());
|
||||||
SetContext(context);
|
SetContext(context);
|
||||||
|
|
||||||
if (itemProto.GetArtifactID() != 0)
|
if (itemProto.GetArtifactID() != 0)
|
||||||
@@ -162,6 +162,7 @@ namespace Game.Entities
|
|||||||
stmt.AddValue(++index, m_randomBonusListId);
|
stmt.AddValue(++index, m_randomBonusListId);
|
||||||
stmt.AddValue(++index, (uint)m_itemData.Durability);
|
stmt.AddValue(++index, (uint)m_itemData.Durability);
|
||||||
stmt.AddValue(++index, (uint)m_itemData.CreatePlayedTime);
|
stmt.AddValue(++index, (uint)m_itemData.CreatePlayedTime);
|
||||||
|
stmt.AddValue(++index, m_itemData.CreateTime);
|
||||||
stmt.AddValue(++index, m_text);
|
stmt.AddValue(++index, m_text);
|
||||||
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetSpeciesId));
|
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetSpeciesId));
|
||||||
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetBreedData));
|
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetBreedData));
|
||||||
@@ -441,16 +442,17 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetCreatePlayedTime(fields.Read<uint>(11));
|
SetCreatePlayedTime(fields.Read<uint>(11));
|
||||||
SetText(fields.Read<string>(12));
|
SetCreateTime(fields.Read<long>(12));
|
||||||
|
SetText(fields.Read<string>(13));
|
||||||
|
|
||||||
SetModifier(ItemModifier.BattlePetSpeciesId, fields.Read<uint>(13));
|
SetModifier(ItemModifier.BattlePetSpeciesId, fields.Read<uint>(14));
|
||||||
SetModifier(ItemModifier.BattlePetBreedData, fields.Read<uint>(14));
|
SetModifier(ItemModifier.BattlePetBreedData, fields.Read<uint>(15));
|
||||||
SetModifier(ItemModifier.BattlePetLevel, fields.Read<ushort>(14));
|
SetModifier(ItemModifier.BattlePetLevel, fields.Read<ushort>(16));
|
||||||
SetModifier(ItemModifier.BattlePetDisplayId, fields.Read<uint>(16));
|
SetModifier(ItemModifier.BattlePetDisplayId, fields.Read<uint>(17));
|
||||||
|
|
||||||
SetContext((ItemContext)fields.Read<byte>(17));
|
SetContext((ItemContext)fields.Read<byte>(18));
|
||||||
|
|
||||||
var bonusListString = new StringArray(fields.Read<string>(18), ' ');
|
var bonusListString = new StringArray(fields.Read<string>(19), ' ');
|
||||||
List<uint> bonusListIDs = new();
|
List<uint> bonusListIDs = new();
|
||||||
for (var i = 0; i < bonusListString.Length; ++i)
|
for (var i = 0; i < bonusListString.Length; ++i)
|
||||||
{
|
{
|
||||||
@@ -467,34 +469,34 @@ namespace Game.Entities
|
|||||||
SetSpellCharges(i, value);
|
SetSpellCharges(i, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetModifier(ItemModifier.TransmogAppearanceAllSpecs, fields.Read<uint>(19));
|
SetModifier(ItemModifier.TransmogAppearanceAllSpecs, fields.Read<uint>(20));
|
||||||
SetModifier(ItemModifier.TransmogAppearanceSpec1, fields.Read<uint>(20));
|
SetModifier(ItemModifier.TransmogAppearanceSpec1, fields.Read<uint>(21));
|
||||||
SetModifier(ItemModifier.TransmogAppearanceSpec2, fields.Read<uint>(21));
|
SetModifier(ItemModifier.TransmogAppearanceSpec2, fields.Read<uint>(22));
|
||||||
SetModifier(ItemModifier.TransmogAppearanceSpec3, fields.Read<uint>(22));
|
SetModifier(ItemModifier.TransmogAppearanceSpec3, fields.Read<uint>(23));
|
||||||
SetModifier(ItemModifier.TransmogAppearanceSpec4, fields.Read<uint>(23));
|
SetModifier(ItemModifier.TransmogAppearanceSpec4, fields.Read<uint>(24));
|
||||||
SetModifier(ItemModifier.TransmogAppearanceSpec5, fields.Read<uint>(24));
|
SetModifier(ItemModifier.TransmogAppearanceSpec5, fields.Read<uint>(25));
|
||||||
|
|
||||||
SetModifier(ItemModifier.EnchantIllusionAllSpecs, fields.Read<uint>(25));
|
SetModifier(ItemModifier.EnchantIllusionAllSpecs, fields.Read<uint>(26));
|
||||||
SetModifier(ItemModifier.EnchantIllusionSpec1, fields.Read<uint>(26));
|
SetModifier(ItemModifier.EnchantIllusionSpec1, fields.Read<uint>(27));
|
||||||
SetModifier(ItemModifier.EnchantIllusionSpec2, fields.Read<uint>(27));
|
SetModifier(ItemModifier.EnchantIllusionSpec2, fields.Read<uint>(28));
|
||||||
SetModifier(ItemModifier.EnchantIllusionSpec3, fields.Read<uint>(28));
|
SetModifier(ItemModifier.EnchantIllusionSpec3, fields.Read<uint>(29));
|
||||||
SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read<uint>(29));
|
|
||||||
SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read<uint>(30));
|
SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read<uint>(30));
|
||||||
|
SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read<uint>(31));
|
||||||
|
|
||||||
SetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs, fields.Read<uint>(31));
|
SetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs, fields.Read<uint>(32));
|
||||||
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1, fields.Read<uint>(32));
|
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1, fields.Read<uint>(33));
|
||||||
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2, fields.Read<uint>(33));
|
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2, fields.Read<uint>(34));
|
||||||
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3, fields.Read<uint>(34));
|
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3, fields.Read<uint>(35));
|
||||||
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4, fields.Read<uint>(35));
|
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4, fields.Read<uint>(36));
|
||||||
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec5, fields.Read<uint>(36));
|
SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec5, fields.Read<uint>(37));
|
||||||
|
|
||||||
int gemFields = 4;
|
int gemFields = 4;
|
||||||
ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets];
|
ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets];
|
||||||
for (int i = 0; i < ItemConst.MaxGemSockets; ++i)
|
for (int i = 0; i < ItemConst.MaxGemSockets; ++i)
|
||||||
{
|
{
|
||||||
gemData[i] = new ItemDynamicFieldGems();
|
gemData[i] = new ItemDynamicFieldGems();
|
||||||
gemData[i].ItemId = fields.Read<uint>(37 + i * gemFields);
|
gemData[i].ItemId = fields.Read<uint>(38 + i * gemFields);
|
||||||
var gemBonusListIDs = new StringArray(fields.Read<string>(38 + i * gemFields), ' ');
|
var gemBonusListIDs = new StringArray(fields.Read<string>(39 + i * gemFields), ' ');
|
||||||
if (!gemBonusListIDs.IsEmpty())
|
if (!gemBonusListIDs.IsEmpty())
|
||||||
{
|
{
|
||||||
uint b = 0;
|
uint b = 0;
|
||||||
@@ -505,13 +507,13 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gemData[i].Context = fields.Read<byte>(39 + i * gemFields);
|
gemData[i].Context = fields.Read<byte>(40 + i * gemFields);
|
||||||
if (gemData[i].ItemId != 0)
|
if (gemData[i].ItemId != 0)
|
||||||
SetGem((ushort)i, gemData[i], fields.Read<uint>(40 + i * gemFields));
|
SetGem((ushort)i, gemData[i], fields.Read<uint>(41 + i * gemFields));
|
||||||
}
|
}
|
||||||
|
|
||||||
SetModifier(ItemModifier.TimewalkerLevel, fields.Read<uint>(49));
|
SetModifier(ItemModifier.TimewalkerLevel, fields.Read<uint>(50));
|
||||||
SetModifier(ItemModifier.ArtifactKnowledgeLevel, fields.Read<uint>(50));
|
SetModifier(ItemModifier.ArtifactKnowledgeLevel, fields.Read<uint>(51));
|
||||||
|
|
||||||
// Enchants must be loaded after all other bonus/scaling data
|
// Enchants must be loaded after all other bonus/scaling data
|
||||||
var enchantmentTokens = new StringArray(fields.Read<string>(8), ' ');
|
var enchantmentTokens = new StringArray(fields.Read<string>(8), ' ');
|
||||||
@@ -1224,6 +1226,7 @@ namespace Game.Entities
|
|||||||
newItem.ReplaceAllItemFlags((ItemFieldFlags)(m_itemData.DynamicFlags & ~(uint)(ItemFieldFlags.Refundable | ItemFieldFlags.BopTradeable)));
|
newItem.ReplaceAllItemFlags((ItemFieldFlags)(m_itemData.DynamicFlags & ~(uint)(ItemFieldFlags.Refundable | ItemFieldFlags.BopTradeable)));
|
||||||
newItem.SetExpiration(m_itemData.Expiration);
|
newItem.SetExpiration(m_itemData.Expiration);
|
||||||
newItem.SetBonuses(m_itemData.ItemBonusKey.GetValue().BonusListIDs);
|
newItem.SetBonuses(m_itemData.ItemBonusKey.GetValue().BonusListIDs);
|
||||||
|
newItem.SetFixedLevel(GetModifier(ItemModifier.TimewalkerLevel));
|
||||||
// player CAN be NULL in which case we must not update random properties because that accesses player's item update queue
|
// player CAN be NULL in which case we must not update random properties because that accesses player's item update queue
|
||||||
if (player != null)
|
if (player != null)
|
||||||
newItem.SetItemRandomBonusList(m_randomBonusListId);
|
newItem.SetItemRandomBonusList(m_randomBonusListId);
|
||||||
@@ -1413,40 +1416,14 @@ namespace Game.Entities
|
|||||||
owner.GetSession().GetCollectionMgr().AddItemAppearance(this);
|
owner.GetSession().GetCollectionMgr().AddItemAppearance(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdatePlayedTime(Player owner)
|
|
||||||
{
|
|
||||||
// Get current played time
|
|
||||||
uint current_playtime = m_itemData.CreatePlayedTime;
|
|
||||||
// Calculate time elapsed since last played time update
|
|
||||||
long curtime = GameTime.GetGameTime();
|
|
||||||
uint elapsed = (uint)(curtime - m_lastPlayedTimeUpdate);
|
|
||||||
uint new_playtime = current_playtime + elapsed;
|
|
||||||
// Check if the refund timer has expired yet
|
|
||||||
if (new_playtime <= 2 * Time.Hour)
|
|
||||||
{
|
|
||||||
// No? Proceed.
|
|
||||||
// Update the data field
|
|
||||||
SetCreatePlayedTime(new_playtime);
|
|
||||||
// Flag as changed to get saved to DB
|
|
||||||
SetState(ItemUpdateState.Changed, owner);
|
|
||||||
// Speaks for itself
|
|
||||||
m_lastPlayedTimeUpdate = curtime;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Yes
|
|
||||||
SetNotRefundable(owner);
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint GetPlayedTime()
|
public uint GetPlayedTime()
|
||||||
{
|
{
|
||||||
long curtime = GameTime.GetGameTime();
|
return m_itemData.CreatePlayedTime;
|
||||||
uint elapsed = (uint)(curtime - m_lastPlayedTimeUpdate);
|
|
||||||
return m_itemData.CreatePlayedTime + elapsed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsRefundExpired()
|
public bool IsRefundExpired()
|
||||||
{
|
{
|
||||||
return (GetPlayedTime() > 2 * Time.Hour);
|
return m_itemData.CreateTime + 2 * Time.Hour <= GameTime.GetGameTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSoulboundTradeable(List<ObjectGuid> allowedLooters)
|
public void SetSoulboundTradeable(List<ObjectGuid> allowedLooters)
|
||||||
@@ -1472,7 +1449,7 @@ namespace Game.Entities
|
|||||||
public bool CheckSoulboundTradeExpire()
|
public bool CheckSoulboundTradeExpire()
|
||||||
{
|
{
|
||||||
// called from owner's update - GetOwner() MUST be valid
|
// called from owner's update - GetOwner() MUST be valid
|
||||||
if (m_itemData.CreatePlayedTime + 2 * Time.Hour < GetOwner().GetTotalPlayedTime())
|
if (m_itemData.CreatePlayedTime + 4 * Time.Hour < GetOwner().GetTotalPlayedTime())
|
||||||
{
|
{
|
||||||
ClearSoulboundTradeable(GetOwner());
|
ClearSoulboundTradeable(GetOwner());
|
||||||
return true; // remove from tradeable list
|
return true; // remove from tradeable list
|
||||||
@@ -2626,6 +2603,7 @@ namespace Game.Entities
|
|||||||
public int GetEnchantmentCharges(EnchantmentSlot slot) { return m_itemData.Enchantment[(int)slot].Charges; }
|
public int GetEnchantmentCharges(EnchantmentSlot slot) { return m_itemData.Enchantment[(int)slot].Charges; }
|
||||||
|
|
||||||
public void SetCreatePlayedTime(uint createPlayedTime) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.CreatePlayedTime), createPlayedTime); }
|
public void SetCreatePlayedTime(uint createPlayedTime) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.CreatePlayedTime), createPlayedTime); }
|
||||||
|
public void SetCreateTime(long createTime) { SetUpdateFieldValue(m_values.ModifyValue(m_itemData).ModifyValue(m_itemData.CreateTime), createTime); }
|
||||||
|
|
||||||
public string GetText() { return m_text; }
|
public string GetText() { return m_text; }
|
||||||
public void SetText(string text) { m_text = text; }
|
public void SetText(string text) { m_text = text; }
|
||||||
@@ -2784,7 +2762,6 @@ namespace Game.Entities
|
|||||||
int uQueuePos;
|
int uQueuePos;
|
||||||
string m_text;
|
string m_text;
|
||||||
bool mb_in_trade;
|
bool mb_in_trade;
|
||||||
long m_lastPlayedTimeUpdate;
|
|
||||||
List<ObjectGuid> allowedGUIDs = new();
|
List<ObjectGuid> allowedGUIDs = new();
|
||||||
uint m_randomBonusListId; // store separately to easily find which bonus list is the one randomly given for stat rerolling
|
uint m_randomBonusListId; // store separately to easily find which bonus list is the one randomly given for stat rerolling
|
||||||
ObjectGuid m_childItem;
|
ObjectGuid m_childItem;
|
||||||
|
|||||||
@@ -397,7 +397,7 @@ namespace Game.Entities
|
|||||||
public UpdateField<uint> MaxDurability = new(0, 11);
|
public UpdateField<uint> MaxDurability = new(0, 11);
|
||||||
public UpdateField<uint> CreatePlayedTime = new(0, 12);
|
public UpdateField<uint> CreatePlayedTime = new(0, 12);
|
||||||
public UpdateField<int> Context = new(0, 13);
|
public UpdateField<int> Context = new(0, 13);
|
||||||
public UpdateField<ulong> CreateTime = new(0, 14);
|
public UpdateField<long> CreateTime = new(0, 14);
|
||||||
public UpdateField<ulong> ArtifactXP = new(0, 15);
|
public UpdateField<ulong> ArtifactXP = new(0, 15);
|
||||||
public UpdateField<byte> ItemAppearanceModID = new(0, 16);
|
public UpdateField<byte> ItemAppearanceModID = new(0, 16);
|
||||||
public UpdateField<ItemModList> Modifiers = new(0, 17);
|
public UpdateField<ItemModList> Modifiers = new(0, 17);
|
||||||
@@ -436,7 +436,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
data.WriteUInt32(CreatePlayedTime);
|
data.WriteUInt32(CreatePlayedTime);
|
||||||
data.WriteInt32(Context);
|
data.WriteInt32(Context);
|
||||||
data.WriteUInt64(CreateTime);
|
data.WriteInt64(CreateTime);
|
||||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
|
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
|
||||||
{
|
{
|
||||||
data.WriteUInt64(ArtifactXP);
|
data.WriteUInt64(ArtifactXP);
|
||||||
@@ -577,7 +577,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
if (changesMask[14])
|
if (changesMask[14])
|
||||||
{
|
{
|
||||||
data.WriteUInt64(CreateTime);
|
data.WriteInt64(CreateTime);
|
||||||
}
|
}
|
||||||
if (changesMask[15])
|
if (changesMask[15])
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -66,9 +66,9 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ulong counter = result.Read<ulong>(51);
|
ulong dbId = result.Read<ulong>(52);
|
||||||
ObjectGuid bagGuid = counter != 0 ? ObjectGuid.Create(HighGuid.Item, counter) : ObjectGuid.Empty;
|
ObjectGuid bagGuid = dbId != 0 ? ObjectGuid.Create(HighGuid.Item, dbId) : ObjectGuid.Empty;
|
||||||
byte slot = result.Read<byte>(52);
|
byte slot = result.Read<byte>(53);
|
||||||
|
|
||||||
GetSession().GetCollectionMgr().CheckHeirloomUpgrades(item);
|
GetSession().GetCollectionMgr().CheckHeirloomUpgrades(item);
|
||||||
GetSession().GetCollectionMgr().AddItemAppearance(item);
|
GetSession().GetCollectionMgr().AddItemAppearance(item);
|
||||||
@@ -226,10 +226,10 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
if (item.IsRefundable())
|
if (item.IsRefundable())
|
||||||
{
|
{
|
||||||
if (item.GetPlayedTime() > (2 * Time.Hour))
|
if (item.IsRefundExpired())
|
||||||
{
|
{
|
||||||
Log.outDebug(LogFilter.Player, "LoadInventory: player (GUID: {0}, name: {1}) has item (GUID: {2}, entry: {3}) with expired refund time ({4}). Deleting refund data and removing " +
|
Log.outDebug(LogFilter.Player, "LoadInventory: player (GUID: {0}, name: {1}) has item (GUID: {2}, entry: {3}) with expired refund time ({4}). Deleting refund data and removing " +
|
||||||
"efundable flag.", GetGUID().ToString(), GetName(), item.GetGUID().ToString(), item.GetEntry(), item.GetPlayedTime());
|
"efundable flag.", GetGUID().ToString(), GetName(), item.GetGUID().ToString(), item.GetEntry(), GetTotalPlayedTime() - item.GetPlayedTime());
|
||||||
|
|
||||||
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_ITEM_REFUND_INSTANCE);
|
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_ITEM_REFUND_INSTANCE);
|
||||||
stmt.AddValue(0, item.GetGUID().ToString());
|
stmt.AddValue(0, item.GetGUID().ToString());
|
||||||
@@ -1332,7 +1332,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ulong mailId = mailItemsResult.Read<ulong>(52);
|
ulong mailId = mailItemsResult.Read<ulong>(53);
|
||||||
_LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], mailItemsResult.GetFields(), additionalData.LookupByKey(mailItemsResult.Read<ulong>(0)));
|
_LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], mailItemsResult.GetFields(), additionalData.LookupByKey(mailItemsResult.Read<ulong>(0)));
|
||||||
}
|
}
|
||||||
while (mailItemsResult.NextRow());
|
while (mailItemsResult.NextRow());
|
||||||
@@ -1366,7 +1366,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
|
|
||||||
Item item = Bag.NewItemOrBag(proto);
|
Item item = Bag.NewItemOrBag(proto);
|
||||||
ObjectGuid ownerGuid = fields.Read<ulong>(51) != 0 ? ObjectGuid.Create(HighGuid.Player, fields.Read<ulong>(51)) : ObjectGuid.Empty;
|
ObjectGuid ownerGuid = fields.Read<ulong>(52) != 0 ? ObjectGuid.Create(HighGuid.Player, fields.Read<ulong>(52)) : ObjectGuid.Empty;
|
||||||
if (!item.LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
|
if (!item.LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Player, $"Player._LoadMailedItems: Item (GUID: {itemGuid}) in mail ({mailId}) doesn't exist, deleted from mail.");
|
Log.outError(LogFilter.Player, $"Player._LoadMailedItems: Item (GUID: {itemGuid}) in mail ({mailId}) doesn't exist, deleted from mail.");
|
||||||
@@ -1735,7 +1735,8 @@ namespace Game.Entities
|
|||||||
Item item = GetItemByGuid(guid);
|
Item item = GetItemByGuid(guid);
|
||||||
if (item != null)
|
if (item != null)
|
||||||
{
|
{
|
||||||
item.UpdatePlayedTime(this);
|
if (item.IsRefundable() && item.IsRefundExpired())
|
||||||
|
item.SetNotRefundable(this);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -4161,7 +4162,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ulong mailId = resultItems.Read<ulong>(52);
|
ulong mailId = resultItems.Read<ulong>(53);
|
||||||
Item mailItem = _LoadMailedItem(playerGuid, null, mailId, null, resultItems.GetFields(), additionalData.LookupByKey(resultItems.Read<ulong>(0)));
|
Item mailItem = _LoadMailedItem(playerGuid, null, mailId, null, resultItems.GetFields(), additionalData.LookupByKey(resultItems.Read<ulong>(0)));
|
||||||
if (mailItem != null)
|
if (mailItem != null)
|
||||||
itemsByMail.Add(mailId, mailItem);
|
itemsByMail.Add(mailId, mailItem);
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
public void SendRefundInfo(Item item)
|
public void SendRefundInfo(Item item)
|
||||||
{
|
{
|
||||||
// This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
|
if (item.IsRefundable() && item.IsRefundExpired())
|
||||||
item.UpdatePlayedTime(this);
|
item.SetNotRefundable(this);
|
||||||
|
|
||||||
if (!item.IsRefundable())
|
if (!item.IsRefundable())
|
||||||
{
|
{
|
||||||
@@ -159,7 +159,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
SetItemPurchaseData setItemPurchaseData = new();
|
SetItemPurchaseData setItemPurchaseData = new();
|
||||||
setItemPurchaseData.ItemGUID = item.GetGUID();
|
setItemPurchaseData.ItemGUID = item.GetGUID();
|
||||||
setItemPurchaseData.PurchaseTime = GetTotalPlayedTime() - item.GetPlayedTime();
|
setItemPurchaseData.PurchaseTime = item.m_itemData.CreatePlayedTime;
|
||||||
setItemPurchaseData.Contents.Money = item.GetPaidMoney();
|
setItemPurchaseData.Contents.Money = item.GetPaidMoney();
|
||||||
|
|
||||||
for (byte i = 0; i < ItemConst.MaxItemExtCostItems; ++i) // item cost data
|
for (byte i = 0; i < ItemConst.MaxItemExtCostItems; ++i) // item cost data
|
||||||
@@ -1259,19 +1259,19 @@ namespace Game.Entities
|
|||||||
if (bonusListIDs != null)
|
if (bonusListIDs != null)
|
||||||
item.SetBonuses(bonusListIDs);
|
item.SetBonuses(bonusListIDs);
|
||||||
|
|
||||||
|
item.SetFixedLevel(GetLevel());
|
||||||
|
item.SetItemRandomBonusList(randomBonusListId);
|
||||||
|
item.SetCreatePlayedTime(GetTotalPlayedTime());
|
||||||
|
|
||||||
item = StoreItem(pos, item, update);
|
item = StoreItem(pos, item, update);
|
||||||
|
|
||||||
ItemAddedQuestCheck(itemId, count, false);
|
ItemAddedQuestCheck(itemId, count, false);
|
||||||
UpdateCriteria(CriteriaType.ObtainAnyItem, itemId, count);
|
UpdateCriteria(CriteriaType.ObtainAnyItem, itemId, count);
|
||||||
UpdateCriteria(CriteriaType.AcquireItem, itemId, count);
|
UpdateCriteria(CriteriaType.AcquireItem, itemId, count);
|
||||||
|
|
||||||
item.SetFixedLevel(GetLevel());
|
|
||||||
item.SetItemRandomBonusList(randomBonusListId);
|
|
||||||
|
|
||||||
if (allowedLooters != null && allowedLooters.Count > 1 && item.GetTemplate().GetMaxStackSize() == 1 && item.IsSoulBound())
|
if (allowedLooters != null && allowedLooters.Count > 1 && item.GetTemplate().GetMaxStackSize() == 1 && item.IsSoulBound())
|
||||||
{
|
{
|
||||||
item.SetSoulboundTradeable(allowedLooters);
|
item.SetSoulboundTradeable(allowedLooters);
|
||||||
item.SetCreatePlayedTime(GetTotalPlayedTime());
|
|
||||||
AddTradeableItem(item);
|
AddTradeableItem(item);
|
||||||
|
|
||||||
// save data
|
// save data
|
||||||
|
|||||||
@@ -1403,7 +1403,7 @@ namespace Game.Guilds
|
|||||||
|
|
||||||
public bool LoadBankItemFromDB(SQLFields field)
|
public bool LoadBankItemFromDB(SQLFields field)
|
||||||
{
|
{
|
||||||
byte tabId = field.Read<byte>(52);
|
byte tabId = field.Read<byte>(53);
|
||||||
if (tabId >= _GetPurchasedTabsSize())
|
if (tabId >= _GetPurchasedTabsSize())
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Guild, "Invalid tab for item (GUID: {0}, id: {1}) in guild bank, skipped.",
|
Log.outError(LogFilter.Guild, "Invalid tab for item (GUID: {0}, id: {1}) in guild bank, skipped.",
|
||||||
@@ -3371,7 +3371,7 @@ namespace Game.Guilds
|
|||||||
|
|
||||||
public bool LoadItemFromDB(SQLFields field)
|
public bool LoadItemFromDB(SQLFields field)
|
||||||
{
|
{
|
||||||
byte slotId = field.Read<byte>(53);
|
byte slotId = field.Read<byte>(54);
|
||||||
uint itemGuid = field.Read<uint>(0);
|
uint itemGuid = field.Read<uint>(0);
|
||||||
uint itemEntry = field.Read<uint>(1);
|
uint itemEntry = field.Read<uint>(1);
|
||||||
if (slotId >= GuildConst.MaxBankSlots)
|
if (slotId >= GuildConst.MaxBankSlots)
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ namespace Game
|
|||||||
uint count = 0;
|
uint count = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ulong guildId = result.Read<ulong>(51);
|
ulong guildId = result.Read<ulong>(52);
|
||||||
Guild guild = GetGuildById(guildId);
|
Guild guild = GetGuildById(guildId);
|
||||||
if (guild != null)
|
if (guild != null)
|
||||||
guild.LoadBankItemFromDB(result.GetFields());
|
guild.LoadBankItemFromDB(result.GetFields());
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
// adjust time (depends on /played)
|
// adjust time (depends on /played)
|
||||||
if (myItems[i].IsBOPTradeable())
|
if (myItems[i].m_itemData.CreatePlayedTime != 0)
|
||||||
myItems[i].SetCreatePlayedTime(trader.GetTotalPlayedTime() - (GetPlayer().GetTotalPlayedTime() - myItems[i].m_itemData.CreatePlayedTime));
|
myItems[i].SetCreatePlayedTime(trader.GetTotalPlayedTime() - (GetPlayer().GetTotalPlayedTime() - myItems[i].m_itemData.CreatePlayedTime));
|
||||||
// store
|
// store
|
||||||
trader.MoveItemToInventory(traderDst, myItems[i], true, true);
|
trader.MoveItemToInventory(traderDst, myItems[i], true, true);
|
||||||
@@ -130,7 +130,7 @@ namespace Game
|
|||||||
|
|
||||||
|
|
||||||
// adjust time (depends on /played)
|
// adjust time (depends on /played)
|
||||||
if (hisItems[i].IsBOPTradeable())
|
if (hisItems[i].m_itemData.CreatePlayedTime != 0)
|
||||||
hisItems[i].SetCreatePlayedTime(GetPlayer().GetTotalPlayedTime() - (trader.GetTotalPlayedTime() - hisItems[i].m_itemData.CreatePlayedTime));
|
hisItems[i].SetCreatePlayedTime(GetPlayer().GetTotalPlayedTime() - (trader.GetTotalPlayedTime() - hisItems[i].m_itemData.CreatePlayedTime));
|
||||||
// store
|
// store
|
||||||
GetPlayer().MoveItemToInventory(playerDst, hisItems[i], true, true);
|
GetPlayer().MoveItemToInventory(playerDst, hisItems[i], true, true);
|
||||||
|
|||||||
Reference in New Issue
Block a user