ModernUO/Projects/UOContent/Mobiles/Vendors/VendorBackpack.cs
Kamron Batman f58117a877
fix: Moves ContextMenu out of core, streamlines code, fixes bugs (#1873)
## Summary
- Removes allocation of a `List<ContextMenuEntry>` every time a context menu is created.
- Moves packet/context menu creation logic out of the core
- Fixes tame entry

## BREAKING CHANGE
> [!Important]
> **Developer Note**
> ```cs
> public virtual void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
> ```
> and similar functions changed to
> ```cs
> public virtual void GetContextMenuEntries(Mobile from, ref PooledRefList<ContextMenuEntry> list)
> ```
2024-07-20 21:33:23 -07:00

186 lines
4.7 KiB
C#

using ModernUO.Serialization;
using Server.Collections;
using Server.ContextMenus;
using Server.Engines.BulkOrders;
using Server.Ethics;
using Server.Items;
using Server.Multis;
using Server.Targeting;
namespace Server.Mobiles;
[SerializationGenerator(0, false)]
public partial class VendorBackpack : Backpack
{
public VendorBackpack()
{
Layer = Layer.Backpack;
Weight = 1.0;
}
public override int DefaultMaxWeight => 0;
public override bool CheckHold(Mobile m, Item item, bool message, bool checkItems, int plusItems, int plusWeight)
{
if (!base.CheckHold(m, item, message, checkItems, plusItems, plusWeight))
{
return false;
}
if (Ethic.IsImbued(item, true))
{
if (message)
{
m.SendMessage("Imbued items may not be sold here.");
}
return false;
}
if (!BaseHouse.NewVendorSystem && Parent is PlayerVendor vendor)
{
var house = vendor.House;
if (house?.IsAosRules == true && !house.CheckAosStorage(1 + item.TotalItems + plusItems))
{
if (message)
{
m.SendLocalizedMessage(1061839); // This action would exceed the secure storage limit of the house.
}
return false;
}
}
return true;
}
public override bool IsAccessibleTo(Mobile m) => true;
public override bool CheckItemUse(Mobile from, Item item)
{
if (!base.CheckItemUse(from, item))
{
return false;
}
if (item is Container or BulkOrderBook)
{
return true;
}
from.SendLocalizedMessage(500447); // That is not accessible.
return false;
}
public override bool CheckTarget(Mobile from, Target targ, object targeted) =>
base.CheckTarget(from, targ, targeted) &&
(from.AccessLevel >= AccessLevel.GameMaster ||
targ.GetType().IsDefined(typeof(PlayerVendorTargetAttribute), false));
public override void GetChildContextMenuEntries(Mobile from, ref PooledRefList<ContextMenuEntry> list, Item item)
{
base.GetChildContextMenuEntries(from, ref list, item);
if (RootParent is not PlayerVendor pv || pv.IsOwner(from))
{
return;
}
var vi = pv.GetVendorItem(item);
if (vi != null)
{
list.Add(new BuyEntry());
}
}
public override void GetChildNameProperties(IPropertyList list, Item item)
{
base.GetChildNameProperties(list, item);
var pv = RootParent as PlayerVendor;
var vi = pv?.GetVendorItem(item);
if (vi == null)
{
return;
}
if (!vi.IsForSale)
{
list.Add(1043307); // Price: Not for sale.
}
else if (vi.IsForFree)
{
list.Add(1043306); // Price: FREE!
}
else
{
list.Add(1043304, vi.FormattedPrice); // Price: ~1_COST~
}
}
public override void GetChildProperties(IPropertyList list, Item item)
{
base.GetChildProperties(list, item);
var pv = RootParent as PlayerVendor;
var vi = pv?.GetVendorItem(item);
if (vi?.Description?.Length > 0)
{
list.Add(1043305, vi.Description); // <br>Seller's Description:<br>"~1_DESC~"
}
}
public override void OnSingleClickContained(Mobile from, Item item)
{
if (RootParent is PlayerVendor vendor)
{
var vi = vendor.GetVendorItem(item);
if (vi != null)
{
if (!vi.IsForSale)
{
item.LabelTo(from, 1043307); // Price: Not for sale.
}
else if (vi.IsForFree)
{
item.LabelTo(from, 1043306); // Price: FREE!
}
else
{
item.LabelTo(from, 1043304, vi.FormattedPrice); // Price: ~1_COST~
}
if (!string.IsNullOrEmpty(vi.Description))
{
item.LabelTo(from, $"Description: {vi.Description}");
}
}
}
base.OnSingleClickContained(from, item);
}
private class BuyEntry : ContextMenuEntry
{
public BuyEntry() : base(6103)
{
}
public override bool NonLocalUse => true;
public override void OnClick(Mobile from, IEntity target)
{
if (target is Item { Deleted: false } item)
{
PlayerVendor.TryToBuy(item, from);
}
}
}
}