* Fixes tooltip for container furniture so it works. This doesn't work on ClassicUO. * Fixes double click opening container furniture by double clicking the addon component. * Fixes the context menu not showing up sometimes on the addon piece. Note: You cannot drop anything into the addon component since it might be far away and it is not a real container. There is no easy fix for this without building an entire custom container class for addons or changing how items drag/drop entirely. Requires closing/opening container gumps as it switches from one component to another that shares the same content. Also requires sharing tooltips, invalidated properties, process delta changes, etc. Not worth the effort. <img width="444" alt="Screen_Shot_2021-09-12_at_4 27 28_PM" src="https://user-images.githubusercontent.com/3953314/133011752-c5b54cf2-2c7b-45c0-882d-0365ef62e686.png">
120 lines
3.6 KiB
C#
120 lines
3.6 KiB
C#
using System;
|
|
using System.Buffers.Binary;
|
|
using System.Collections.Generic;
|
|
using Server.ContextMenus;
|
|
using Server.Network;
|
|
|
|
namespace Server.Items
|
|
{
|
|
[Serializable(0, false)]
|
|
public partial class AddonContainerComponent : Item, IChoppable
|
|
{
|
|
[Constructible]
|
|
public AddonContainerComponent(int itemID) : base(itemID)
|
|
{
|
|
Movable = false;
|
|
|
|
AddonComponent.ApplyLightTo(this);
|
|
}
|
|
|
|
public virtual bool NeedsWall => false;
|
|
public virtual Point3D WallPosition => Point3D.Zero;
|
|
|
|
[SerializableField(0)]
|
|
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
|
private BaseAddonContainer _addon;
|
|
|
|
[SerializableField(1)]
|
|
[SerializableFieldAttr("[CommandProperty(AccessLevel.GameMaster)]")]
|
|
private Point3D _offset;
|
|
|
|
[Hue]
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public override int Hue
|
|
{
|
|
get => base.Hue;
|
|
set
|
|
{
|
|
base.Hue = value;
|
|
|
|
if (_addon?.ShareHue == true)
|
|
{
|
|
_addon.Hue = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void OnChop(Mobile from)
|
|
{
|
|
if (_addon != null && from.InRange(GetWorldLocation(), 3))
|
|
{
|
|
_addon.OnChop(from);
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(500446); // That is too far away.
|
|
}
|
|
}
|
|
|
|
public override bool OnDragDrop(Mobile from, Item dropped) => _addon?.OnDragDrop(from, dropped) == true;
|
|
|
|
public override void OnDoubleClick(Mobile from) => _addon?.OnComponentUsed(this, from);
|
|
|
|
public override void OnLocationChange(Point3D old)
|
|
{
|
|
if (_addon != null)
|
|
{
|
|
_addon.Location = new Point3D(X - _offset.X, Y - _offset.Y, Z - _offset.Z);
|
|
}
|
|
}
|
|
|
|
public override void OnMapChange()
|
|
{
|
|
if (_addon != null)
|
|
{
|
|
_addon.Map = Map;
|
|
}
|
|
}
|
|
|
|
public override void GetProperties(ObjectPropertyList list) => _addon?.GetProperties(list);
|
|
|
|
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list) =>
|
|
_addon?.GetContextMenuEntries(from, list);
|
|
|
|
public override void OnAfterDelete()
|
|
{
|
|
base.OnAfterDelete();
|
|
|
|
_addon?.Delete();
|
|
}
|
|
|
|
public override void SendWorldPacketTo(NetState ns, ReadOnlySpan<byte> world = default)
|
|
{
|
|
Span<byte> buffer = stackalloc byte[OutgoingEntityPackets.MaxWorldEntityPacketLength].InitializePacket();
|
|
var length = OutgoingItemPackets.CreateWorldItem(buffer, this);
|
|
// Use an itemid of a real container
|
|
BinaryPrimitives.WriteUInt16BigEndian(buffer[7..9], (ushort)(_addon?.ItemID ?? 0x9AB));
|
|
ns.Send(buffer[..length]);
|
|
|
|
base.SendWorldPacketTo(ns, world);
|
|
}
|
|
|
|
[AfterDeserialization]
|
|
private void AfterDeserialization()
|
|
{
|
|
_addon?.OnComponentLoaded(this);
|
|
AddonComponent.ApplyLightTo(this);
|
|
}
|
|
}
|
|
|
|
[Serializable(0, false)]
|
|
public partial class LocalizedContainerComponent : AddonContainerComponent
|
|
{
|
|
[SerializableField(0, setter: "private")]
|
|
private int _number;
|
|
|
|
public LocalizedContainerComponent(int itemID, int labelNumber) : base(itemID) => _number = labelNumber;
|
|
|
|
public override int LabelNumber => _number > 0 ? _number : base.LabelNumber;
|
|
}
|
|
}
|